使用Django template 实现自定义标签

在模版中绑定变量,通常的操作可能是在视图中通过render 传入到模版的上下文中,这样非常简单,不过在页面较多出现该变量时,就需要在每一个请求的视图中做重复的查询传入,这样不利于后期维护和问题分析。
所以很自然的就需要使用自定义的标签来解决重用的问题:

在页面中引入变量通常是这样的: {% xxx %}


在template中提供了三种标签分别是:

simple_tag 简单标签

inclusion_tag 包含标签

assignment_tag 赋值标签

简单标签:

在项目app中创建标签工具包, 如图, blog是创建的app, templatetags是自定义标签的工具包

使用Django template 实现自定义标签_第1张图片
创建标签工具包
  • 导入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 内容如下:

  • 嵌入到模版中
 {% 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 %}
        
  • {{ cate.name }}
  • {% endfor %}

    你可能感兴趣的:(使用Django template 实现自定义标签)