django 自定模板标签的注册


首先注册方法一般都是先实例化一个template.Library。如:

from django import template

register = template.Library()

1.注册自定义过滤器方法

register.filter('A',b)

filter()方法中的2个参数分别:A过滤器的名称(一个字串)和 b过滤器函数本身。


2.注册自定义模板标签方法

register.tag('A',b)

tag()方法需要2个参数:模板标签的名字A和编译的函数b。


3.注册简单标签的方法如:if ,for ,ifequal等等

register.simple_tag(A)

该辅助函数传递的函数只有(单个)参数,参数两边的引号(如果有的话)已被截掉了所以只可能接收到一个普通的Unicode字符串。


4.注册包含标签的方法

register.inclusion_tag('A.html')(B)

inclusion_tag()方法需要2个参数:模板所在的文件A和编译的函数B。

有时候,包含标签需要访问父模板的context.此时可用到takes_context选项,即设置takes_context=True,并且该标签不需要参数,且下面的Python函数会带一个参数:就是当这个标签被调用时的模板context.

@register.inclusion_tag('A.html',takes_context=True)
def jump_link(context):#此处参数必须是context
    return {
        'link':context['home_link'],
        'title':context['home_title'],
        #此处有包含指向主页的变量,即取home_link和home_title中的变量link和title的值
    }

然后创建A.html,里面可能包含下面内容:

XXXXX{{ title }}xxxxxx 该处的link和title分别取自home_link和home_title中的内容。

如果要调用该参数,可以直接加载它的库,然后不带参数地调用它{{ jump_link }}


5.编写自定义模板加载器

load_template_source(template_name,template_dirs=None)

template_name是加载模板的名称,类似于loader.get_template()或者loader.select_template()

template_dirs是一个可选的代替TEMPLATE_DIRS的搜索目录列表

如果加载器能够成功的加载一个模板,此时会返回一个元组(template_source,template_path),template_source:模板引擎编译的模板字符串、template_path:被加载的模板路径。若加载器加载模板失败,那么会触发django.template.TemplateDoesNotExist异常。


注:在上面代码中看到@xxxx,这样的写法,改语法在python 2.4及以上版本中成立,即:

@register.tag(name="A")     #A过滤器的名称(一个字串)
def B(parser.token):
	#.....


或者直接写成:

@register.tag
def B(parser,token):
 	#......
Django此处会使用函数名称B来作为标签名称

此处只举一例,其他写法类似。另如有不同看法,欢迎来讨论。


评论关闭