Filters 变量加工
{#格式 值|函数#}
'|'左右没有空格没有空格没有空格
常用
当前循环. | 作用 |
---|---|
default | 数据为空时设置默认值 |
length | 取变量长度 |
filesizeformat | 文件大小转成可读 |
slice | 从指定位置到指定位切片 |
date | datetime取到的时间,转成指定格式 |
safe | 防止XSS攻击、加上safe才能传标签 |
truncatechars | 取摘显示一段剩下的… |
例子
{#格式 值|函数#}
{# 如果没有值,那么使用默认值#}
<p>{{ bucunzai|default:'空的哦' }}</p>
{# 取出变量长度#}
<q>{{ name }}--{{ name|length }}</q>
{# 文件大小转换成可读型 kb 自动转成bm、g、tb#}
<p>文件大小{{ file_size|filesizeformat }}</p>
{# 切片 从指定位置到指定位 ,例:第3位到-2位#}
<p>切片:{{ slice_str|slice:'3:-2' }}</p>
{# 把datetime取到的时间,转成指定格式#}
<p>格式化:{{ now|date:'Y-m-d H:i:s' }}</p>
{# 如果后端内容包含标签,那么加上safe 才能转义(防止用户直接加script标签作弊)防XSS攻击#}
<p>{{ h_html|safe }}</p>
{# 取摘要只显示一段,指定取长度后面...例:120个字符 #}
<p>长文本:{{ p_str|truncatechars:12 }}</p>
filter自定义加工
缺点只能带一个参数
- 在app内创建固定名:templatetags文件夹
- 在其中创建myfilter.py来装自定义
- 导入模块、实例化对象
- 写自定义功能
- html中导入路径
- 使用自定义方法,带参数则要用:号
'''
1. 在app内创建固定名:templatetags文件夹
2. 在其中创建myfilter.py来装自定义
'''
# 一定要导入
from django import template
register = template.Library()
# 字符串加一个sb
@register.filter(name="addSB") # 告诉模版这里有个自定义方法 名字叫:addSB
def add_sb(value):
return "{} SB".format(value)
# 有参数
@register.filter(name="addstr") # 注册到模版语言
def cut(value, arg):
return '{}{}'.format(value,arg)
HTML中
{# 一定要导入才能使用#}
{% load myfilter %}
<p>自定义:{{ name|addSB}}</p>
{# 参数用:参数传#}
<p>自定义带参数:{{ name|addstr:'技术好'}}</p>
simpletag自定义价格(可多参数
)
# 一定要导入(与filter一样)
from django import template
register = template.Library()
@register.simple_tag(name="plus") # 注册到模版语言.simple_tag
def plus(a, b, c):
return "{} + {} + {}".format(a, b, c)
html中使用
{% load mysimpletag %} <!--导入文件夹路径-->
{# simple tag #}
{% plus "1" "2" "abc" %} <!--格式不同-->
inclusion_tag返回html代码片段
templatetags/my_inclusion.py
from django import template
register = template.Library()
<!--将下面得到的data值,当参数传给result.html处理,然后返回html代码传给调用者-->
@register.inclusion_tag('result.html')
def show_results(n):
n = 1 if n < 1 else int(n)
data = ["第{}项".format(i) for i in range(1, n+1)]
return {"data": data}<!--该值传给注册的result.html处理-->
templates/snippets/result.html
<!--接收到data 后进行处理数据,得到li表-->
<ul>
{% for choice in data %}
<li>{{ choice }}</li>
{% endfor %}
</ul>
templates/index.html
<body>
{% load inclusion_tag_test %}
<!--这里直接传参数10,自动运行结果并返回 一段html-->
{% show_results 10 %}
</body>