详解在Python的Django框架中创建模板库的方法
不管是写自定义标签还是过滤器,第一件要做的事是创建模板库(Django能够导入的基本结构)。
创建一个模板库分两步走:
第一,决定模板库应该放在哪个Django应用下。如果你通过manage.pystartapp创建了一个应用,你可以把它放在那里,或者你可以为模板库单独创建一个应用。我们更推荐使用后者,因为你的filter可能在后来的工程中有用。
无论你采用何种方式,请确保把你的应用添加到INSTALLED_APPS中。我们稍后会解释这一点。
第二,在适当的Django应用包里创建一个templatetags目录。这个目录应当和models.py、views.py等处于同一层次。例如:
books/ __init__.py models.py templatetags/ views.py
在templatetags中创建两个空文件:一个__init__.py(告诉Python这是一个包含了Python代码的包)和一个用来存放你自定义的标签/过滤器定义的文件。第二个文件的名字稍后将用来加载标签。例如,如果你的自定义标签/过滤器在一个叫作poll_extras.py的文件中,你需要在模板中写入如下内容:
{%loadpoll_extras%}
{%load%}标签检查INSTALLED_APPS中的设置,仅允许加载已安装的Django应用程序中的模板库。这是一个安全特性;它可以让你在一台电脑上部署很多的模板库的代码,而又不用把它们暴露给每一个Django安装。
如果你写了一个不和任何特定模型/视图关联的模板库,那么得到一个仅包含templatetags包的Django应用程序包是完全正常的。对于在templatetags包中放置多少个模块没有做任何的限制。需要了解的是:{%load%}语句是通过指定的Python模块名而不是应用名来加载标签/过滤器的。
一旦创建了Python模块,你只需根据是要编写过滤器还是标签来相应的编写一些Python代码。
作为合法的标签库,模块需要包含一个名为register的模块级变量。这个变量是template.Library的实例,是所有注册标签和过滤器的数据结构。所以,请在你的模块的顶部插入如下语句:
fromdjangoimporttemplate register=template.Library()
注意
请阅读Django默认的过滤器和标签的源码,那里有大量的例子。他们分别为:django/template/defaultfilters.py和django/template/defaulttags.py。django.contrib中的某些应用程序也包含模板库。
创建register变量后,你就可以使用它来创建模板的过滤器和标签了。