Django 自定义过滤器、simple_tag、inclusion_tag、mark_safe

自定义过滤器 filter

自定义过滤器只是带有一个或两个参数的Python函数:

  • 在已经注册的app下创建一个python包,包的名字为 templatetags; (包名必须一致)
  • 在python 包中创建py文件,文件可以自定义(mytags.py)
  • 在py文件中写代码:
from django import template 
register = template.Library()
  • 在py文件中写 函数 + 加装饰器
@register.filter
def add_arg(value, arg):
    # 功能
    return "{}_{}".format(value, arg)

 

使用自定义过滤器

{% load mytags %}

{{ 'xxx'|add_arg:'xxx' }}

例子

# 例如,在过滤器{{var | foo:“bar”}}中,过滤器foo将传递变量var和参数“bar”。
# 自定义filter代码文件摆放位置:
app01/
    __init__.py
    models.py
    templatetags/  # 在app01下面新建一个package package
        __init__.py
        app01_filters.py  # 建一个存放自定义filter的py文件
    views.py

#app01_filters.py 文件中编写自定义filter代码
from django import template
register = template.Library()


@register.filter
def fill(value, arg):
    return value.replace(" ", arg)


@register.filter(name="addSB")
def add_sb(value):
    return "{} SB".format(value)

# 使用自定义filter
{# 先导入我们自定义filter那个文件 #}
{% load app01_filters %}

{# 使用我们自定义的filter #}
{{ somevariable|fill:"__" }}
{{ d.name|addSB }}

simple_tag、inclusion_tag

  • 在已经注册的app下创建一个python包,包的名字为 templatetags; (包名必须一致)
  • 在python 包中创建py文件,文件可以自定义(mytags.py)
  • simple_tag、inclusion_tag 中传参不受限制
  • 在py文件中写代码:
from django import template

register = template.Library()


@register.simple_tag
def str_join(*args, **kwargs):

    return "{}_{}".format('_'.join(args), '*'.join(kwargs.values()))


@register.inclusion_tag('pagenum.html')
def pagination(num):
return {'num': range(1, num+1)}


# inclusion_tagpagenum.html 内容
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
<a href="#" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
</li>
{% for li in num %}
<li><a href="#">{{ li }}</a></li>
{% endfor %}

<li>
<a href="#" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
</a>
</li>
</ul>
</nav>
  • HTML 中引用
{% load mytags %}
{% str_join 'a' 'b' 'c' k1='1' k2='2' %}

{% load mytags %}
{% pagination 3 %}
 

不同:

  • 加上不同的装饰器作用不同
    • 装饰器为filter,参数最多只能是两个
    • 装饰器为simple_tag和inclusion_tag,参数不受限制
  • filter 和 simple_tag 返回值比较直接,直接写在调用的部分
  • inclusion_tag 返回值为字典,字典中夹杂变量,变量要交给模板中做渲染,最后输出到调用的地方
  • 在html中调用方式不同
    • filter 调用语法为 {{ }},这种调用语法是可以写在if判断 等语句中
    • filter 和 simple_tag 调用语法为 {% %} ,这种不能用于if判断等语法中

 mark_safe

  • 默认 mark_safe 里边代码为安全的,渲染这段字符串
from django import template 

register = template.Library()


from
django.utils.safestring import mark_safe @register.filter def show_a(name, url): return mark_safe(f'<a href="https://{url}">{name}</a>')

调用 mark_safe

{% load mytags %}

{% show_a 百度 https://www.baidu.com %}

 

posted @ 2021-07-19 10:32  Star-Hitian  阅读(99)  评论(0编辑  收藏  举报