在 settings.py 文件中添加 STATICFILES_DIRS,设置静态文件目录路径。
# settings.py 文件中
在项目的根目录下创建 static 目录,在目录中添加三种静态文件:
续
静态文件创建好之后就可以在模板里面加载静态文件。
①自定义过滤器及标签
为了解决应用中展示逻辑的需求,Django 的模板语言提供了各式各样的 built-in tags and filters。然而,你或许会发现模板内建的这些工具集合不一定全部满足功能的需要。可以通过使用 python 定义自定义标签和过滤器来扩展模板引擎,然后使用 {% load %} 标签。
代码布局
指定自定义模板标签和过滤器的最常见的地方在 Django 应用程序中。
当将 Django 应用程序添到 INSTALLED_APPS 中时,在下面描述的常规位置中定义的任何标签将自动在模板中加载。
这个应用应该包含一个 templatetags 目录,和 views.py,models.py 等文件处于同一级别目录下。如果目录不存在则创建它——不要忘记创建 __init__.py 文件以使得该目录可以作为 python 的包。
自定义的标签和过滤器将放在 templatetags 目录下的一个模块里。这个模块的名字是你稍后将要载入标签时使用的,所以要谨慎的选择名字以防与其它应用下的自定义标签和过滤器名字冲突。
在模板中这样使用:
{% load blog_filters %}
为了让 {% load %} 标签工作,包含自定义标签的应用必须在 INSTALLED_APPS 中。在 templatetags 包中放多少个模块没有限制。只需要记住 {% load %} 声明将会载入给定模块名中的标签/过滤器,而不是应用的名称。
为了成为一个可用的标签库,这个模块必须包含一个名为 register 的变量,它是 template.Library 的一个实例,所有的标签和过滤器都是在其中注册的。所以把如下的内容放在你的模块的顶部:
②编写自定义模板过滤器
自定义过滤器就是一个带有一个或两个参数的 Python 参数:
例如,在 {{ var|foo:'bar' }} 中,foo 过滤器应当传入变量 var 和 参数 “bar”。
定义过滤器的例子:
def mycut(value, arg):
return value.replace(arg, " ")
这个过滤器的使用:
{% somevariable|mycut:"0" %}
大多数过滤器没有参数,在这种情况下,函数不带这个参数即可。
例如:
def mylower(value):
return value.lower()
③注册自定义过滤器
django.template.Library.filter()
让自定义的过滤器在 Django 模板语言中可用,就需要把它注册为你的 Library 实例:
Library.filter() 方法需要两个参数:
还可以把 register.filter() 用作装饰器:
没有声明 name 参数,Django 将使用函数名作为过滤器的名字。
如果你正在编写一个只希望用一个字符串来作为第一个参数的模板过滤器,你应当使用 stringfilter 装饰器。这将在对象被传入你的函数之前把这个对象转换成它的字符串值:
④编写自定义模板标签
许多模板标签需要许多参数-字符串或模板变量,并且仅在基于输入参数和一些外部信息进行一些处理后返回结果。
例如:
current_time 标签可能接受一个格式字符串,并返回与之对应的格式化后的时间。
为了简单化这些类型标签的创建,Django 提供了一个辅助函数 simple_tag。这个函数是 django.template.Library 的一个方法,接受一个任意数目的参数的函数,将其包装在一个 render 函数和上面提到的其它必要部分中,并在模板系统中注册它。
注册标签,向模块的 Library 实例注册代码
tag() 方法有两个参数:
与过滤器注册一样,也可以将其用作装饰器。
如果你的模板标签需要访问当前上下文,你可以在注册标签时使用 takes_context 参数:
另一种常见类型的模板标签是通过渲染另外一个模板来显示一些数据。这些类型的标签被称为“inclusion”标签。
为了简单化设置上下文中变量的标签的创建,Django 提供一个辅助函数 assignment_tag。除了将标签的结果存储在指定的上下文变量中,而不是直接输出,该函数的工作方式与 simple_tag() 相同。
然后你可以使用 as 参数后面跟随变量的名称将结果储存在模板变量中,并将它输出: