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_tag 中 pagenum.html 内容
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
<a href="#" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
{% for li in num %}
<li><a href="#">{{ li }}</a></li>
{% endfor %}
<li>
<a href="#" aria-label="Next">
<span aria-hidden="true">»</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 %}
本文来自博客园, 作者:Star-Hitian, 转载请注明原文链接:https://www.cnblogs.com/Star-Haitian/p/15029085.html