django自定义标签学习整理(simple_tag、inclusion_tag、 assignment_tag)

2022-11-28 Django 0 471

前言介绍

Django 默认提供了很多有用的 内置标签和过滤器 ,标签或者过滤器的作用是随处可用 ,它就好像是一个Django 内部命令可以在页面的不同位置使用

对于博客系统来说,最常见的"最近发布的N条记录""访问量最多的TopN文章" 等都可以使用标签功能是实现。

Django的标签是分类三类

  • 简单标签 simple_tag
  • 应用标签 inclusion_tag
  • 赋值标签 assignment_tag

Django的标签在自定义的时候需要遵循一定的规范

1、标签一定在装载在某个APP下的

2、需要在该APP下创建名字为templatetagsPython包,且名字必须叫这个。既然是包,别忘记了__init__.py 文件

3、在templatetags 包下创建文件名(比如在demo_tags),该文件名不能和Django内置标签名冲突

4、需要在 工程的INSTALLED_APPS 中进行注册

5、最终在template模板中加载 {% load demo_tags%}

自定义简单标签

简单标签通过接受参数,对输入的参数做一些处理,然后返回结果

# blog/templatetags/blog_tags.py

from django import template
# 不管是那种自定义标签,都需要先实现一个 register
register = template.Library()

@register.simple_tag
def say_hello(strs):
    return f'Hello {strs}'

使用装饰器,把 say_hello装饰之后注册到template模板中去,这样就可以在template中通过{% load xxx %} 来导入加载

这里作为演示说明,不定义具体的模板HTML页面,我们使用Django内置的Template 函数进行模拟就行

(django_blog) [ 22-10-24 18:45 ] [ colinspace ] [~/Documents/python_projects/django_blog] python3 manage.py shell
Python 3.9.6 (default, Jul 16 2021, 13:41:17)
[Clang 12.0.5 (clang-1205.0.22.11)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.template import Template, Context
>>>
>>> t = Template("""
... {% load blog_tags %}
... {% say_hello 'Django blog' %}
... """)
>>> t.render(Context())
'\n\nHello Django blog\n'

另外可以通过@register.simple_tag(name='aliasname') 给简单标签设置别名

自定义引用标签

自定义引用标签可以对其他模板进行渲染,然后将渲染结果输出

这里具体的里面是后面要实现的评论功能,在详情页加载评论框,把 评论框作为一个独立的template定义成一个标签

@register.inclusion_tag('comments/comment_form.html', takes_context=True)
# 如果 takes_context=True ,则自定义引用标签函数的第一个参数必须为context
def show_comment_form(context, post, form=None):
    if form is None:
        form = CommentForm()
    return {'form': form, 'post': post}

comments/comment_form.html 是一个独立的template html 文件,这个而文件中定义了一个 form表单

<!-- comments/templates/comments/comment_form.html -->
<form action="{% url 'comments:comment' post.pk %}" method="post" class="comment-form">
    {% csrf_token %}
    <div class="row">
        <div class="col-md-4">
            <label for="{{ form.name.id_for_label }}">{{ form.name.label }}:</label>
            {{ form.name }}
            {{ form.name.errors }}
        </div>
        ... ...
    </div>
</form>

然后在详情页中使用的时候就很方便

<!-- 加载标签 -->
{% load comments_extras %}
<!-- 在详情页文章下面 直接按照标签的形式使用 -->
{% show_comment_form post %}

是不是很简单,这样我们就可以累积成自己的标签库,复用到别的项目中去

自定义赋值标签

赋值标签其实就是简单标签 ,只不过在使用的时候,不直接输出结果,而是使用 as 关键字将结果储存在指定的上下文变量中,从而降低了传输上下文的成本

标签还是使用上面的 say_hello ,继续使用 Template 进行演示

>>> t = Template("""
... {% load blog_tags %}
... {% say_hello 'Django blog' %}
... """)
>>> t.render(Context())
'\n\nHello Django blog\n'
>>> t2 = Template(""" {% load blog_tags %}
... {% say_hello 'Django blog' as s1 %}
... {{ s1 }}
... """)
>>> t2.render(Context())
' \n\nHello Django blog\n'
>>>

可以看到使用过程中把 结果值赋值给了 s1 然后再其他的位置直接使用 s1 就行。而且可以多次使用

>>> t3 = Template(""" {% load blog_tags %}
... {% say_hello 'Django blog' as s1 %}
... {{ s1 }}
... <hr>
... 继续使用 {{ s1 }}
... """)
>>> t3.render(Context())
' \n\nHello Django blog\n<hr>\n继续使用 Hello Django blog\n'


如果觉得文章对你有所帮助,欢迎点赞和赞赏~

文章同步发布个人微信公众号,欢迎关注。第一时间获取最新发布

全栈运维/DailyJobOps

如果阅读过程中有任何问题,欢迎入群交流~

QQ交流群
本文标题: django自定义标签学习整理(simple_tag、inclusion_tag、 assignment_tag)
本文作者: 老鹰
发布时间: 2022-11-28 17
原始链接: http://newblog.colinspace.com/blog/post/20/
许可协议: 署名-非商业性使用 4.0 国际许可协议
转载请保留原文链接及作者