django字段设置(Django的filter和tag使用说明和如何自定义)

那么首先来说明下什么时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

3、capfirst

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

例如:

{{"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 }}

效果如下:

django字段设置(Django的filter和tag使用说明和如何自定义)(1)

当然还有很多的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 %}

django字段设置(Django的filter和tag使用说明和如何自定义)(2)

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

django字段设置(Django的filter和tag使用说明和如何自定义)(3)

4、{% url %} 链接url

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

django字段设置(Django的filter和tag使用说明和如何自定义)(4)

5、{% with %} 变量替换

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

{% with total=www.qnjslm.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名称

django字段设置(Django的filter和tag使用说明和如何自定义)(5)

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)

模板中我们使用

django字段设置(Django的filter和tag使用说明和如何自定义)(6)

前台的效果如下图

django字段设置(Django的filter和tag使用说明和如何自定义)(7)

模板的标签(Tags):

标签的使用:{% Tags %}

autoescape

自动转义标签,要在html中原样输出html标签的时候使用

{% autoescape on %}

{{ body }}

{% endautoescape %}

对body的内容进行转义,原样输出html标签

block

模板继承,详细看模板继承

comment

多行注解,忽略、不输出{% comment %}{% endcommit %}标签里面的内容

csrf_token

防止跨站点攻击,在表单<form>标签中添加{%csrf_token%}

cycle

用于循环产生字段

{% for o in some_list %}

{% cycle 'one' 'two' %}<br/>

{% endfor %}

这将会在for循环中交替出现row1和row2字符串

结果为(some_list的长度为5):

one

two

one

two

one

cycle的参数可以为字符串或者为变量

{% cycle 'one' 'two' as str %}->{{str}}

可以在循环中多次引用字符串

结果为:

one->one

two->two

one->one

two->two

one->one

debug

输出整个调试信息负载,包括当前上下文和导入的模块

extends

与block标签配合使用

filter

{% filter upper|lower %}

this is text

{% endfilter %}

将filter标签里面的经过upper处理在将结果经过lower处理,filter参数可选择多个

firstof

输出第一个不是False的参数

{% firstof var1 var2 var3 %}

等同于

{% if var1 %}

{{ var1 }}

{% elif var2 %}

{{ var2 }}

{% elif var3 %}

{{ var3 }}

{% endif %}

{% firstof var1 var2 var3 "fallback value" %}

当所有参数都为False时,输出"fallback value"

此标签自动转义默认值参数:

{% autoescape off %}

{% firstof var1 var2 var3 "<strong>fallback value</strong>" %}

{% endautoescape %}

可以使用safe管道符忽略转义:

{% firstof var1 var2|safe var3 "<strong>fallback value</strong>"|safe %}

可以用一下语法将输出值储存在变量value中:

{% firstof var1 var2 var3 as value %}

for

点运算符:

variable.object

优先返回

varialbe['object'] #字典类型查找

variable.object #属性查找

variable.object() #方法调用

variable[object] #列表索引查找

for循环设置中可用的变量

forloop.counter 循环的当前迭代(1索引)

forloop.counter0 循环的当前迭代(0索引)

forloop.revcounter 循环结束时的迭代次数(1索引)

forloop.revcounter0 循环结束时的迭代次数(0索引)

forloop.first 如果这是第一次迭代,则为真

forloop.last 如果这是最后一次迭代,则为真

forloop.parentloop 对于嵌套循环,这是上一循环的forloop对象

for....empty

配合for标签使用

{% for number in numbers %}

number

{% empty %} #numbers对象为空时执行

the numbers is empty

{% endfor %}

if

条件判断语句

{% if athlete_list %}

one

{% elif athlete_in_locker_room_list %}

two

{% else %}

three

{% endif %}

在if标签中可以使用布尔运算符or and not等

在同一标签中同时使用and 和or时and的优先级将大于or

{% if athlete_list and coach_list or cheerleader_list %}

等于

if (athlete_list and coach_list) or cheerleader_list

if标签也可以用运算符 == != < > <= >= in is

{% if a > b and b > c %}

也可以在if标签中使用过滤器

{% if messages|length >= 100 %}

You have lots of messages today!

{% endif %}

ifchanged

{% for t in text %}

{% ifchanged %}{{ t }}{% endifchanged %} #当t的内容与上次重复时,不显示出来

{%endfor%}

#也可以指定判断某个变量

{% ifchanged date.date %} {{ date.date }} {% endifchanged %}

#也可以添加{% else %}标签

{% ifchanged match.ballot_id %}

some

{% else %}

some

{% endifchanged %}

include

加载一个模板并且用当前的上下文内容渲染它。这标签能用来在一个模板中包含另一个模板,模板的名字可以是一个变量或者是字符串。

{% include "foo/bar.html" %}

模板名是相对于模板加载器的根目录的。字符串参数可以用./或者../开头。

此标签的参数也可以指定一个拥有render()方法渲染内容的Template对象。

#也可以在标签中用with指定参数

{% include "name_snippet.html" with person="Jane" greeting="Hello" %}

#可以指定字段only来指定只接受include内的参数来渲染

{% include "name_snippet.html" with greeting="Hi" only %}

load

用于装载自定义的标签或者过滤器的库

lorem

用法:

{% lorem [count] [method] [random] %}

count:用来指定要生成的段落或者单词的数目(默认为1)

method:w代表单词,p代表html段落,b代表纯文本段落

用来生成测试文本

now

用于格式化显示时间

It is {% now "jS F Y H:i" %} #可以使用反斜杠\进行转义

#也可以将输出的字符串作为变量储存下来

{% now "Y" as current_year %}

regroup

?

resetcycle

重置cycle的计数

#也可以指定重置的cycle标签

{% cycle 'one' 'two' as one %}

{% cycle 'one' 'two' as two %}

{% resetcycle one %}

spaceless

清除html标签直接的空白符号(只删除标签之间的,标签和文本之间的不删除)

{% spaceless %}

<p>

<a href="foo/">Foo</a>

</p>

{% endspaceless %}

templatetag

用法:

{% templatetag param %}

将参数进行转义

param:

openblock ----> {%

closeblock ----> %}

openvariable ----> {{

closevariable ----> }}

openbrace----> {

closebrace----> }

opencomment----> {#

closecomment----> #}

url

用给定的名称和可选参数返回结对路径引用,任何特殊的字符都将会用iri_to_uri()编码。

语法:

{% url 'some-url-name' v1 v2 %}

#第一个参数是url的name,它可以是字符串或者变量

#额外的参数是可选的,将用作为url上的参数

#也可以使用关键词参数,但位置参数和关键词参数不要混合使用

{% url 'some-url-name' arg1=v1 arg2=v2 %}

如果指定的url不存在,则将会抛出一个NoReverseMatch错误,这将导致服务器返回一个错误页面。

#一下调用将不会直接生成url,而是会保存在变量the_url中

{% url 'some-url-name' arg arg2 as the_url %}

#可以使用标签{% block %}限定变量the_url作用的范围

verbatim

停止模板渲染引擎呈现此块标记的内容。

widthratio

按照比例计算数值

{% widthratio this_value max_value max_width %}

#可以使用as储存数值

with

简化复杂的变量调用

{% with total=business.employees.count %}

#这里可以直接使用total,total的作用域只存在标签体中

{% endwith %}

#可以指定更多的参数

{% with alpha=1 beta=2 %}

...

{% endwith %}

过滤器:

内置过滤器:django.template.defaultfilters

过滤器改变变量的值和改变标签的参数

语法:

{{ django|title }} #将变量django内容里面的每个单词首字符转换为大写

可以向过滤器传递参数:

{{ my_date|date:"Y-m-d" }}

内建的过滤器:

add

#将参数加载变量value上

{{ value|add:"2" }}

#变量和参数也可以是其它的类型(例如string list)

addslashes

转义

{{ value|addslashes }}

#如果value是:I'm using Django

将输出:I\'m using Django

capfirst

将值的第一个字母大写

center

{{ value|center:"15" }}

#将value居中在宽度为15

cut

{{ value|cut:param }}

#将value中的全部param去掉

date

按照给定的格式去格式化日期

详细

default

当值为False时,则输出默认参数

#如果值value为False,则输出nothing

{{ value|default:"nothing" }}

default_if_none

和default类似,不过仅在值为None时才输出默认值

dictsort

将列表中的字典按照给定的参数作为字段进行排序

[

{'name': 'zed', 'age': 19},

{'name': 'amy', 'age': 22},

{'name': 'joe', 'age': 31},

]

参数为name

则输出:

[

{'name': 'amy', 'age': 22},

{'name': 'joe', 'age': 31},

{'name': 'zed', 'age': 19},

]

或者是:

{{ value|dictsort:0 }} #参数应该输入int类型,而不是字符串类型

value:

[

('a', '42'),

('c', 'string'),

('b', 'foo'),

]

排序后:

[

('a', '42'),

('b', 'foo'),

('c', 'string'),

]

dictsortreversed

工作原理和上面一样,不过是倒序排序

divisibleby

#如果value能被参数'3'整除,则输出True,否则输出False

{{ value|divisibleby:"3" }}

escape

转义,在html中输出html标签的字符串表达

escapejs

??

filesizeformat

{{ value|filesizeformat }} #将value转换为有利于理解的文件大小字符串表示

first

返回列表中的第一个元素

{{ value|first }}

floatformat

如果不带参数,则四舍五入到小数点后一位

如果带参数,则四舍五入保留参数大小的小数个数(n为参数大小)

如果参数为零,则不保留小数

如果参数为负数,则四舍五入保留参数绝对值大小的小数个数,如果小数点后全为零,则忽略小数

force_escape

类似于escape,此过滤器立即应用并返回一个新的转义字符串

get_digit

给定一个整数,返回请求的数字

{{ value|get_digit:"2" }}

#返回value的十位数字

#若参数为3,则返回百位数字

iriencode

将value转换为适合包含在URL中的字符串表达形式

join

用给定的字符串连接列表,返回最终字符串表达形式

类似python的str.join(list)

json_script

New in Django 2.1

安全地将Python对象输出为JSON,包装在<script>标记中,以便与JavaScript一起使用。

{{ value|json_script:"hello-data" }}

#如果value为{'hello': 'world'}

#则输出:

<script id="hello-data" type="application/json">{"hello": "world"}</script>

last

返回列表中最后的元素

{{ value|last }}

length

返回序列对象的长度,对于未知类型,则返回0

length_is

如果给定序列的长度等于传入的参数,则返回True,否则返回False

linebreaks

将换行符转换为<br>

一个新行加上一个空行变成了段落换行符</p>

linebreaksbr

将换行符转换为<br>

linenumbers

显示文本的行数

one

two

three

转换为:

1. one

2. two

3. three

ljust

{{ value|ljust:"10" }}

#如果value是django,则输出 "Django "

lower

将给定的字符串全部转换为小写字符

make_list

将给定的字符串转换为列表

phone2numeric

将电话号码转换成数字输出

pluralize

应用于英文复数场景,参数可以定义输出的后缀

pprint

调试用??

random

随机输出给定的列表中的元素

{{ value|random }}

#如果value是['a','b','c'],则随机输出其中的一个

rjust

类似于ljust,不过对齐方式是向右

safe

标记内容,表示不用被转义

safeseq

类似于safe,但应用于列表中的每个参数

slice

给定一个列表,返回列表的切片对象

slugify

转换为ASCII。将空格转换为连字符。删除非字母数字、下划线或连字符的字符。转换为小写的。还可以去掉开头和结尾的空白。

"Joel is a slug" 转换为 "joel-is-a-slug"

stringformat

根据给定的参数格式化变量

{{ value|stringformat:"E" }}

#如果value为10,则输出1.000000E 01

striptags

将给定的字符串中的html的全部标签删除

time

格式化时间

{{ value|time:"H:i" }} #value为时间

timesince

{{ start|timesince:later }}

#代表自从start之后,到later过了多少时间

#相当于返回later-start

timeuntil

{{ start|timeuntil:before }}

#before为可选参数,代表在start之间的时间

#返回从bofore到start过了多少时间(start-before)

title

将给定的字符串中所有的单词的首字母转换为大写,其它字符转换为小写

truncatechars

缩短字符串长度为给定的参数,缩短后字符串带...后缀

{{ value|truncatechars:9 }}

#value="Joel is a slug"

#输出"Joel i..."

truncatechars_html

类似truncatechars,但忽略html标签,将标签里面的内容自动缩短。

{{ value|truncatechars_html:9 }}

#value="<p>Joel is a slug</p>"

#输出"<p>Joel i...</p>"

truncatewords

类似truncatechars,但以一个单词为单位计算。

truncatewords_html

类似truncatechars_html,但以一个单词为单位计算。

unordered_list

根据给定的嵌套的list自动生成嵌套的列表

upper

将给定的字符串中的字母全部转换为大写字母

urlencode

转义URL中使用的值

urlize

将给定的url地址转换为html中可点击的链接

urlizetrunc

类似于urlize和truncatechars的结合体

wordcount

返回给定字符串中单词的数量

wordwrap

指定每行的长度

{{ value|wordwrap:5 }}

#如果value为"Joel is a slug"

#则输出

Joel

is a

slug

yesno

将给定值的布尔值转换为自定义的参数

{{ value|yesno:"yeah,no,maybe" }}

#如果value为True,则输出yeah

#如果为False,则输出no

#如果为None,则输出maybe(此参数可省略,如果省略,则默认输出False对应的结果)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页