在模版中绑定变量,通常的操作可能是在视图中通过render 传入到模版的上下文中,这样非常简单,不过在页面较多出现该变量时,就需要在每一个请求的视图中做重复的查询传入,这样不利于后期维护和问题分析。
所以很自然的就需要使用自定义的标签来解决重用的问题:
在页面中引入变量通常是这样的: {% xxx %}
在template中提供了三种标签分别是:
simple_tag 简单标签
inclusion_tag 包含标签
assignment_tag 赋值标签
简单标签:
在项目app中创建标签工具包, 如图, blog是创建的app, templatetags是自定义标签的工具包
- 导入template
from django import template
fromblog.modelsimportPost,Category
- 实例化标签库
register = template.Library()
- 自定义一个简单标签
@register.simple_tag
def total_posts():
""" 自定义一个简单标签"""
return Post.published.count()
- 在前台模版中首先加载工具包,然后引用即可
{% load blog_tags %}
{% total_posts %}
包含标签
包含标签相较于简单标签,加入了自定义内容块。
在template文件夹中创建文件名为 lasted_post.html 的文件
创建包含标签函数,此处装饰器中,变量名称就是内容块的文件名,这样,就可以将lasted_post 作为上下文传入lasted_post.html中
@register.inclusion_tag('lasted_post.html')
def get_lasted_posts(count=3):
"""自定义包含标签"""
lasted_post = Post.published.order_by('-publish')[:count]
return {'lasted_post': lasted_post}
- lasted_post.html 内容如下:
<ul>
{% for post in lasted_post %}
<li><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></li>
{% endfor %}
</ul>
- 嵌入到模版中
{% get_lasted_posts 3 %}
赋值标签
包含标签的弊端是不够灵活,而赋值标签则类似于通过视图函数传入变量,能实现最大限度的灵活。
实现分类标签方式如下:
@register.assignment_tag
def get_all_cate():
"""赋值标签"""
cate = Category.objects.all()
return cate
- 模版引用的方法和普通视图传递的变量一样
{% get_all_cate as cates %}
{% for cate in cates %}
<li><a href="?cate={{ cate.slug }}" title="{{ cate.name }}">{{ cate.name }}</a></li>
{% endfor %}