Django中自定义tag

当Django自带的tag无法满足你的需求时,可以自定义tag来进行扩展。

在哪里自定义标签:

    通常的做法是将自定义的tag放入需要用到该tag的Django app中。然后这个app应该包含一个叫做templatetags的Python包(包含__init__.py文件) ,如果这个包不存在就自己创建一个,当添加了templatetags包后一定要重启项目。

    你自定义的tags一般都是放在templatetags下的一个Python模块中,该模块的名字就是你待会load加载tags时的名字,所以该名字请上心一点(不能和其他app中定义的app或filter名字冲突)。

看下图应该更加明确一点:

使用的时候:{% load poll_extras %}

自定义tag所在的app一定要在INSTALLED_APPS添加,否则自定义tag将无法工作。

记住加载tag时,加载的是tag的module的名字而不是app的名字。

要想成为一个有效的tag,该tag对应的module中必须包含名为   register的module级变量,该变量是一个temlate.Libraries(模板库)实例。向下面这样写:

编写自定义模板tag:

Django给我们编写自定义tag提供了捷径,先考虑如何用捷径写出tag在考虑从头写一个tag。

捷径:

简单tag---通过简单的传入配置数据返回结果

当需要访问上下文(context)变量时,你需要在注册tag时添加takes_context参数:

注意这种情况下函数的第一个参数必须是context。

重命名tag时:

simple_tag可接受任意数量的普通(positional)参数和关键字参数

在template中向tag传递参数时,要以空格隔开,且关键字参数必须要放到最后,ex.

还可以将tag的返回结果保存到template中的变量中:

自定义标签:

    tag和django.template.Node对象有很深的关联:

将函数注册到tag中:

也可以通过装饰器注册:

下面在模板中引用的tag是一样的效果(记得先load tag所在的Python module):

未完待续...

你可能感兴趣的:(Django中自定义tag)