Django的filter和tag使用说明和如何自定义

  • A+
所属分类:Alex笔记

那么首先来说明下什么时Filter什么时tag了,如何去区分了

1、在使用上区别:

filter 使用方法{{ obj|filter:param }}

tag使用方法{% tags %}

2、filter可以使用作为if判断语句的标签,标签时不可以的

3、filter最多只能传递两个参数,而且tag可以传递多个

 
 

filter使用说明

语法的格式如下

{{ obj|filter:param }}

obj 我们需要处理的对象

filter 我们的filter,常见有如下罗列出的

param filter的参数

 
 

1、add

添加相应的值,这个比较好理解,例如:

{{ 3|add:2 }} //那么这个就是3+2最后结果等于5,当然了我们的3一般时python传过来的变量了。

注意前面的obj只能时整形数值,字符串无法相加

age|add:3

 
 

2、addslashes

给变量中的引号前加上斜线,就是转译引号,

例如:

{{"q'mm'df"|addslashes}}

那么该输出接入如下

q\'mm\'df

 
 

3capfirst

首字目大写,很好理解不多说

例如:

{{"q'mm'df"|capfirst}}

那么输出结果如下:

Q'mm'df

 
 

4、cut

把指定的字符串剪切掉

例如我们把单引号去掉:

{{"q'mm'df"|cut:"'"}}

输出如下:

Qmmdf

 
 

5、date

格式化时间日期显示,注意了,需要处理的对象必须时时间对象类型

例如:

dt变量类容为:{{ dt }}<br>

处理后的内容:{{ dt|date:'Y-m-d' }}

输出结果如下:

dt变量类容为:April 6, 2018, 1:07 p.m.

处理后的内容:2018-04-06

 
 

6、default

如果值是False,就替换成设置的默认值,否则就是用本来的值

例如:

{{False|default:"这是False"}}

<br>

{{True|default:"这是True"}}

输出结果如下:

这是False

True

 
 

7、default_if_none

如果值是None,就替换成设置的默认值,否则就使用本来的值,和default差不多原理

例如:

{{
None|default_if_none:"没有值默认替换" }}

<br>

{{
"
"|default_if_none:"就算有一个空格也是不会替换的" }}

 
 

输入结果如下:

没有值默认替换

 
 

8、filesizeformat

对数字进行格式化,IT中经常使用到的容量显示技术

例如:

{{
"5120"|filesizeformat
}}

结果就是

5.0 KB

 
 

9、first、last、slice

字符串处理,first取第一个字符,last去最后一个字符,slice切片和python中一样使用

例如:

{{ "5120"|last }}

<br>

{{ "5120"|first }}

<br>

{{ "5120"|slice:":-2" }}

结果:

0

5

51

 
 

10、safe、autoescape、striptags

让浏览器渲染我们的变量内容,

例如:

 
 

原始变量:{{ dt }}

<br>

有时候我们想浏览器去渲染我们在数据库等地方取出来的html语言:

<br>

第一种方法,也是最常用的,使用safe:<br>

{{
dt|safe
}}

<br>

第二种方法,使用autoescape off,注意了autoescape 就是标签了:<br>

{%
autoescape
off%}

{{
dt
}}

{%
endautoescape
%}

<br>

第三种方法,使用striptags,注意该方法,会去除html语言标记哦:<br>

{{
dt|striptags
}}

 
 

效果如下:

040618 0918 Djangofilte1 - Django的filter和tag使用说明和如何自定义

 
 

 
 

当然还有很多的filter,以上罗列出来的只是我们常用的,更多的filter请查看官方文档

https://docs.djangoproject.com/en/2.0/ref/templates/builtins/

 
 

一般常用的标签tag说明:

 
 

1、最常用的if标签 {% if %}

{% if 条件表达式 %}

表达式成立执行代码块

{% elif 条件表达式 %}

表达式成立执行代码块

{% else %}

所有表达式不成立执行代码块

{% endif %}

 
 

2、循环标签{% for %}的使用

{% for object in objects %}

执行的循环体

{% endfor %}

 
 

3、{%csrf_token%} 跨站攻击校验

请求网页时会生成一个csrf校验字符串,防止跨站请求工具,注意如果我们使用render_to_response方法,这个就不生效。

使用方法,在from表单中直接使用{% csrf_token %}

040618 0918 Djangofilte2 - Django的filter和tag使用说明和如何自定义

在前台我们每次请求,会随机生产一个校验码,在表单提交时后台会进行校验

040618 0918 Djangofilte3 - Django的filter和tag使用说明和如何自定义

 
 

4、{% url %} 链接url

显示指定路由的URL路径,具体查看上面的两个截图,我们需要在url路由指定name,前面进行调用

040618 0918 Djangofilte4 - Django的filter和tag使用说明和如何自定义

 
 

5、{% with %} 变量替换

例如把一个长的变量做一个短的别名

{% with total=www.opskb.com %}

{{ total }}

{% endwith %}

 
 

6、{% verbatim %}: 禁止进行渲染

有时候我们需要在页面上显示模板语言的原型,就会用到verbatim ,还记得上面的safe的filter

{% verbatim %}

{{ 123|add:2 }}

{% endverbatim %}

 
 

7、{% load %}加载标签库

我们使用最多的就是加载自定义标签库了,产靠下一节的演示

 
 

现在来介绍我们自定义Tag以及Filter

第一步:在APP目录下创建一个模块名字为templatetags(注意名字必须时这个)

第二步:在templatetags目录下创建py文件,这个文件名字可以随意了

第三步:创建我们自定义的filter以及tag

1、首先需要引用template,如果需要返回html内容需要引入mark_safe

from django import template

from django.utils.safestring import mark_safe

2、实例化一个对象,注意这里必须使用register 来接收,不可以使用其他名称

register = template.Library()

3、定义自已的函数,使用装饰器@register.filter、@register.simple_tag

4、在Django的设置中,在APP中一定加载我们的APP名称

040618 0918 Djangofilte5 - Django的filter和tag使用说明和如何自定义

5、在模板中我们使用load加载我们的文件名,就可以安装上面的方法进行使用

{% load my_test %}

 
 

详细代码(my_test):

from django import template

from django.utils.safestring import mark_safe

register = template.Library()

 
 

 
 

@register.filter

def filter_multi(v1, v2):

return v1 * v2

 
 

 
 

@register.simple_tag

def tag_multi(v1, v2, v3):

return v1 * v2 + v3

 
 

 
 

@register.simple_tag

def input_multi(id, name, class_name):

result = "<input id='%s' class='%s' name='%s'/>" % (id, class_name, name)

return mark_safe(result)

 
 

模板中我们使用

040618 0918 Djangofilte6 - Django的filter和tag使用说明和如何自定义

 
 

前台的效果如下图

040618 0918 Djangofilte7 - Django的filter和tag使用说明和如何自定义

 
 

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: