python3之Django内置模板标签和过滤器

时间:2021-07-11 08:52:53

一、模板标签

内置标签:

1、autoescape

控制当前的自动转义行为,此标记采用on或者off作为参数,并确定自动转义是否在块内有效。该块以endautoescape结束标签关闭。

views:
def index(request):
return render(request,'app02/index.html',{'title':'mypage','user':'<ul>dd</ul>'}) html:
<body>
{{ user }} #默认为不转义#} {{ user|safe }} #转义HTML标签#} {% autoescape on %} #转义HTML标签后,按原样输出#}
转义:{{ user }}
{% endautoescape %}
<br />
{% autoescape off %}
不转义:{{ user }}
{% endautoescape %}
</body> outing:
<ul>dd</ul>
    dd
转义:<ul>dd</ul>
不转义:
dd

2、block

定义可以被子模板覆盖的块,为模板继承时使用

3、comment

注释一段代码,标签不能嵌套

4、cycle

多次循环迭代,给定的值,每次遇到此标签就会生成一个参数对应第一个,如此类推,如循环完没有参数了则继续从头开始循环。

<body>
<ul>
<li>{% cycle 'one' 'two' 'three' 'four' as infocycle %}</li>
<li>{% cycle infocycle %}</li>
<li>{% cycle infocycle %}</li>
<li>{% cycle infocycle %}</li>
<li>{% cycle infocycle %}</li>
<li>{% cycle infocycle %}</li>
<li>{% cycle infocycle %}</li>
</ul>
</body> #outing
  • one
  • two
  • three
  • four
  • one
  • two
  • three

可以使用多个模板变量,也可以使用变量加字符串的形式混合使用。

views:
def dome(request):
info = ['html','jques','dome']
row = {'one':'python','two':'javascript','three':'css'}
return render(request,'app02/dome.html',{'info':info,'row':row}) html:
<ol>
<li>{% cycle info.0 info.1 info.2 'TOT' row.one row.three row.two as twovariable %}</li>
<li>{% cycle twovariable %}</li>
<li>{% cycle twovariable %}</li>
<li>{% cycle twovariable %}</li>
<li>{% cycle twovariable %}</li>
<li>{% cycle twovariable %}</li>
<li>{% cycle twovariable %}</li>
<li>{% cycle twovariable %}</li>
  </ol> #outing:
  1. html
  2. jques
  3. dome
  4. TOT
  5. python
  6. css
  7. javascript
  8. html

您可以在cycle标记中使用任意数量的值,以空格分隔。包含在单引号(')或双引号(")中的值被视为字符串文字,而不带引号的值则被视为模板变量。

如果使用关键字,silent,将在第二次调用是使用上一个值。

<ol>
<li>dd:{% cycle 1 2 3 'TOT' as twovariable %}</li>
<li>{% cycle twovariable %}</li>
<li>{% cycle twovariable silent %}</li>
<li>{% cycle twovariable %}</li>
<li>{% cycle twovariable %}</li>
</ol> #outing
  1. dd:1
  2. 2
  3. 2
  4. 3
  5. TOT

5、debug

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

6、extends

表示该模板扩展了父模板

这个标签有两种使用方式:

{% extends "base.html" %}(带引号)使用文字值 "base.html"作为父模板的名称来扩展。

{% extends variable %}使用的变量variable。如果变量的计算结果为字符串,Django将使用该字符串作为父模板的名称。如果变量评估为一个Template对象,Django将使用该对象作为父模板。

通常,模板名称是相对于模板加载程序的根目录,字符串参数也可以是./开头的相对路径。

7、filter

通过一个或多个过滤器过滤块的内容。可以使用管道指定多个过滤器,并且过滤器可以具有参数,就像变量语法一样。

8、firstof

输出不是第一个参数的变量为false,如果所有传递的变量都是false,则不输出

{% firstof var1 var2 var3 %}

相当于:

{% if var1 %}
{{ var1 }}
{% elif var2 %}
{{ var2 }}
{% elif var3 %}
{{ var3 }}
{% endif %}

如果所有传递的变量都是False,您还可以使用文字字符串作为回退值:

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

您可以使用该语法将输出存储在变量中。{% firstof var1 var2 var3 asvalue %}

9、for

循环输出数组中的每个项目,使项目在上下文变量中可用。

循环列表的值:

<ul>
{% for item in list %}
<li>{{ item }}</li>
{% endfor %}
</ul>

可以使用reversed反向循环列表:

<ul>
{% for item in list reversed %}
<li>{{ item }}</li>
{% endfor %}
</ul>

列表可以使用嵌套循环:

<ul>
{% for x in list1 %}
{% for y in x %}
<li>{{ y }}</li>
{% endfor %}
{% endfor %}
</ul>

字典循环,可以使用items方法得到字典的建和值:

<ul>
{% for k,v in row.items %}
<li>{{ k }}={{ v }}</li>
{% endfor %}
</ul>

for循环再循环中设置的变量:

forloop.conter  循环的当前迭代索引从1开始计数

forloop.counter0  循环当前迭代的索引从0开始计数

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

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

forloop.first  如果这是通过循环的第一次,则为真

forloop.last  如果这是通过循环的最后一次,则为真

forloop.parentloop  对于嵌套循环,这是围绕当前循环的循环

<body>
<ul>
{% for i in li %}
<li>{{ forloop.counter }}:{{ i }}</li> <!--从1开始索引计数-->
{% endfor %}
</ul>
<br />
<ul>
{% for i in li %}
<li>{{ forloop.counter0 }}:{{ i }}</li> <!--从0开始索引计数-->
{% endfor %}
</ul> <ul>
{% for i in li %}
<li>{{ forloop.revcounter }}:{{ i }}</li> <!--从1开始反索引计数-->
{% endfor %}
</ul> <ul>
{% for i in li %}
<li>{{ forloop.counter0 }}:{{ i }}</li> <!--从0开始反索引计数-->
{% endfor %}
</ul> <ul>
{% for i in li %}
{% if forloop.first %} <!--判断是通过循环第一次则添加类名-->
<li class="first">
{% else %}
<li>
{% endif %}
{{ i }}
</li>
{% endfor %}
</ul> <ul>
{% for number in li %}
{{ number }}
{% if not forloop.last %} <!--判断不是最后一个索引则加逗号-->
,
{% endif %}
{% endfor %}
</ul>
</body>

for   empty:如果给定的数组为空或无法找到,则for标签可以接受一个可选的子句,显示文本:{% empty %}

<ul>
{% for number in li1 %}
{{ number }}
{% empty %}
<li>sorry ,no number in this li1.</li> <!--判断如果迭代找不到活变量不存在则输出empty的文本内容-->
{% endfor %}
</ul>

10、if

判断标签计算一个变量,并且该变量是真,即存在,不为空,不是flase的数据块的内容被输出:{% if %}

#views:
def ifelse(request):
po = request.POST.get('number') #获取提交的数据
return render(request,'app02/ifelse.html',{'po':int(po)}) #传递给模板 #html:
<form action="" method="post">
<p><input type="text" name="number"></p>
<p><input type="submit" value="提交"></p>
</form>
{{ po }}
{% if po >= 90 %}
<h1>优秀:{{ po }}</h1>
{% elif po >= 80 %}
<h1>良好:{{ po }}</h1>
{% elif po >= 70 %}
<h1>一般:{{ po }}</h1>
{% elif po >= 60 %}
<h1>及格:{{ po }}</h1>
{% else %}
<h1>不及格:{{ po }}</h1>
{% endif %}
</body>

if标签可以使用and,or或not以测试多个变量或否定一个给定的变量,允许在同一个标签中使用两个and和or子句,and优先级高于or。

if标签还可以使用==,!=,<,>,<=,>=,in等运算符。

表达式的优先级从低到高:or - and - not - in -  ==,!=,<,>,<=,>=

二、过滤器

1、include

加载模板并使用当前上下文进行渲染。这是在模板中“包含”其他模板的一种方式。

模板名称可以是变量,也可以是单引号或双引号的硬编码(带引号)的字符串。

2、load

加载自定义模板标记集

3、lorem

随机显示“lorem ipsum”拉丁文字。这对于在模板中提供示例数据很有用

4、now

显示当前日期或者时间,使用根据给定字符串的格式,这样的字符串可以宝行格式说明字符

5、regroup

用一个共同的属性重新组合一个类似对象的列表。

cities = [
{'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
{'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
{'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
{'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
{'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]
{% regroup cities by country as country_list %}

<ul>
{% for country in country_list %}
<li>{{ country.grouper }}
<ul>
{% for city in country.list %}
<li>{{ city.name }}: {{ city.population }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>

如果被用来分组的属性值不连续出现的话,将会分出多个组,这是一个bug。

6、spaceless

删除HTML标签之间的空白,这包括制表符和换行符。

7、templatetag

输出用于组成模板标签的语法字符之一

由于模板系统没有“转义”的概念,因此要显示模板标记中使用的某个位,必须使用该标记。{%templatetag %}

该参数告诉哪个模板位输出:

论据 输出
openblock {%
closeblock %}
openvariable {{
closevariable }}
openbrace {
closebrace }
opencomment {#
closecomment #}
{% templatetag openblock %}url'www.baidu.com' {% templatetag closeblock %}

8、url

返回与给定试图和可选参数匹配的绝对路径引用(没有域名的URL)路径中的任何特殊字符都将使用编码iri_to_uri().

9、verbatim

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

通常的用法是允许与Django语法冲突的JavaScript模板层

内置过滤器:

10、add将参数添加到值

{{ value|add:"" }}

如果value4,那么输出将是6

此过滤器将首先尝试将这两个值强制为整数。如果失败,它会尝试将值加在一起。这将适用于某些数据类型(字符串,列表等),并在其他数据类型上失败。如果失败,结果将是一个空字符串。

11、addslashes:在引号前添加斜杠,例如:用于以CSV格式转义字符串。

{{ "i'm using django"|addslashes }}

#输出为:
i\'m using django

12、capfirst:大写该值的第一个字符,如果第一个字符不是字母,则此过滤器不起作用。

{{ "i'm using django"|capfirst }}

#输出为:
I'm using django

13、center:将值置于给定宽度的字段中

"{{ "django"|center:"30" }}"

14、cut:从给定字符串中删除所有给定的值

"{{ "django"|cut:"j" }}"

15、date:根据给定的格式格式化日期。

{{ date|date:"Y-m-d H:i:s w" }}

Y:4位年;m:月;d:日;H:24小时时;i:分钟;s:秒;w:星期,从0开始表示星期日

16、default:如果变量值为false,则使用给定的默认值,否则使用该值。

{{ value|default:"nothing" }}

17、default_if_none:如果值是None,则使用给定的默认值,否则,使用该值。

{{ value|default_if_none:"nothing" }}

18、dictsort:根据参数中给出的关键字列出字典并返回该列表。

市场场景,可以更加某个属性进行数据排序重组:

[
{'title': '', 'author': {'name': 'George', 'age': 45}},
{'title': 'Timequake', 'author': {'name': 'Kurt', 'age': 75}},
{'title': 'Alice', 'author': {'name': 'Lewis', 'age': 33}},
] {% for book in books|dictsort:"author.age" %}
* {{ book.title }} ({{ book.author.name }})
{% endfor %} * Alice (Lewis)
* 1984 (George)
* Timequake (Kurt)

19、dictsortreversed:获取字典列表并返回该列表按照参数中给出的建以相反顺序排序,这与上面的过滤器完全相同,但返回的值将按相反顺序排列。

20、divisibleby:返回True值是否可以被参数整除。

{{ 9|divisibleby:"" }}  #返回true

21、escape:转义字符串的HTML

  • < 转换为 &lt;
  • > 转换为 &gt;
  • ' (单引号)转换为 '
  • " (双引号)转换为 &quot;
  • & 转换为 &amp;

应用于escape通常会对结果应用自动转义的变量只会导致一轮转义完成。所以即使在自动逃脱的环境中使用这个功能也是安全的。如果您想要应用多个转义通行证,请使用force_escape过滤器。

22、escapejs:转义用于JavaScript字符串的字符。这并没有使字符串安全为HTML或JavaScript模板文字的使用,但使用模板来生成JavaScript / JSON什么时候保护你的语法错误。

23、filesizeformat:人性化输出可读的值

{{ 123456|filesizeformat }}

#输出:
120.6 KB

24、first:返回列表中的第一个项目

{{ value|first }}

25、floatformat:在没有参数的情况下使用时,将浮点数四舍五入到小数点后一位,但只有在显示小数部分的情况下有用。

 value          模板            产量
34.23234 {{ value|floatformat }} 34.2
34.00000 {{ value|floatformat }} 34
34.26000 {{ value|floatformat }} 34.3
#可以指定四舍五入到小数后的第几位:

 34.23234  {{ value|floatformat }}    34.232

如传递参数为0,则浮点数在四舍五入到最接近整数的值,如不带参数则等效于-1。

26、force_escape:将HTML转义应用于字符串

27、get_digit:给定一个整数,返回请求的数字,其中1是最右边的数字,2是第二个最右边的数字等。返回无效输入的原始值(如果输入或参数不是整数,或者如果参数小于1)。否则,输出总是一个整数。

{{ po|get_digit:"" }}

28、join使用字符串链接列表元素

{{ lis|join:"++" }}

29、last:返回列表中的最后一个元素

{{ lis|last }}

30、length:返回值的长度,适合于字符串和列表。如返回0则表明变量未定义。

{{ 'abcdefg'|length }}

31、length_is:如果值的长度是参数,则返回True,否则返回False。

{{ 'abcdefg'|length_is:"" }}

32、linebreaks:将纯文本中的换行符转换成HTML中的换行符。

value = ‘Joel\nis a slug’

{{ value|linebreaks }}

#output:
Joel
is a slug

33、linebreaksbr:将纯文本中的所有换行符转换为HTML换行符。

34、linenumbers:用行号显示文本。

{{ value|linenumbers }}

35、左对齐给定宽度的字段中的值。

"{{ value|ljust:"10" }}"

36、lower:将字符串转换为全部小写。

{{ 'ABCD'|lower }}

37、返回转换为列表的值,将字符串转换为列表。

{{ value|make_list }}

#output:
['D', 'j', 'a', 'n', 'g', 'o']

38、phone2numeric:将电话号码(可能包含字母)转换为数字等值。

{{ '800-COLLECT'|phone2numeric }}

#output:
800-2655328

39、pluralize:如果值不为1,则返回复数后缀,默认情况下,该后缀为‘s'。

40、pprint:一个包装,用于调试。

41、random:返回给定列表中的一个随机元素。

42、rjust:在给定宽度的字段中右对齐该值。

43、safe:将字符串标记为在输出之前不需要进一步的HTML转义,自动转义关闭时,此过滤器不起作用。

44、safeseq:将safe过滤器应用于序列的每一个元素,结合使用序列操作的其他过滤器很有用。

45、slice:返回列表的一部分,使用与python列表切片相同的语法。

lis = [1,2,3,4,5]

{{ lis|slice:":2" }}

#output
[1, 2]

46、slugify:转换为ASCII。将空格转换为连字符。删除非字母数字,下划线或连字符的字符。转换大写为小写。也剥去前导和尾随空白。

value = '   Django IS %a *fsd_dsf-kkk  '

{{ value|slugify }}

#output:
django-is-a-fsd_dsf-kkk

47、stringformat:根据参数格式化变量,这是一个字符串格式化说明符,说明符使用printf风格的字符串格式语法,除了前面的“%”。

value = 10.1

{{ value|stringformat:"d" }}

#output:
#输出整数
10

48、striptags:去除所有HTML标签

value = "<b>Joel</b> <button>is</button> a <span>slug</span>"

{{ value|striptags }}

#output
Joel is a slug

49、time:根据给定的时间格式,格式化输出时间

Y:4位年;m:月;d:日;H:24小时时;i:分钟;s:秒;w:星期,从0开始表示星期日

date = datetime.datetime.now()

<li>{{ date }}</li>
<li>{{ date|time:"H:i:s" }}</li> #output
May 21, 2018, 12:33 p.m.
12:33:50

50、timesince:将日期格式化为自该日期以来的时间(例如,“4天,6小时”)。

51、timeuntil:类似于timesince,除了它测量从现在开始直到给定日期或日期时间的时间

52、title:将字符串转换为标题,方法是让单词以大写字母开头,其余字符以小写字母开头。这个标签不会保留小写字母。

<li>{{ "i am mr's zhang"|title }}</li>

#output
I Am Mr's Zhang

53、truncatechars:如果字符串长于指定的字符数,则截断字符串。截断的字符串将以可转换的省略号序列(“...”)结尾。

<li>{{ "i am mr's zhang"|truncatechars:5}}</li>

#output
i ... #总长度保留5位

54、truncatechars_html:类似于truncatechars,它知道HTML标记。在截断点之后立即关闭在字符串中打开并且在截断点之前未关闭的任何标记。

55、truncatwords:在一定数量的单词之后截断一个字符串。

<li>{{ "i am mr's zhang"|truncatewords:3}}</li>

#output
i am mr's ...

56、truncatewords_html:类似于truncatewords,它知道HTML标记。任何在字符串中打开且在截断点之前未关闭的标记在截断后立即关闭。

这比效率低truncatewords,因此只能在传递HTML文本时使用。

57、unordered_list:递归地获取自嵌套列表并返回一个HTML无序列表 - 无需打开和关闭<ul>标记

var =  ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]

{{ var|unordered_list }}

#output
<li>States
<ul>
<li>Kansas
<ul>
<li>Lawrence</li>
<li>Topeka</li>
</ul>
</li>
<li>Illinois</li>
</ul>
</li>

58、upper:将字符串转换为全部大写。

var =  "run python manage migrate to apply them"

{{ var|upper }}

RUN PYTHON MANAGE MIGRATE TO APPLY THEM

59、urlencode:转义在URL中使用的值。

var1 =  "https://www.baidu.com/obj?a=b&b=d"

<li>{{ var1|urlencode }}</li>
<li>{{ var1|urlencode:"" }}</li> #当所有字符都应该转义时可使用空字符串 #output: https%3A//www.baidu.com/obj%3Fa%3Db%26b%3Dd
https%3A%2F%2Fwww.baidu.com%2Fobj%3Fa%3Db%26b%3Dd

60、urlize:将文本中的网址和电子邮件地址转换为可点击的链接。

<li>{{ "http://www.baidu.com"|urlize }}</li>
<li>{{ "check out www.baidu.com"|urlize }}</li>
<li>{{ "Send questions to foo@example.com"|urlize }}</li> #output
http://www.baidu.com
check out www.baidu.com
Send questions to foo@example.com

61、urlizetrunc:将URL和电子邮件地址转换为可点击链接,就像urlize一样,但会截断超过给定字符数限制的URL。

<li>{{ "check out www.djangoproject.com more"|urlizetrunc:18 }}</li>

#output
check out www.djangoproje... more

62、wordcount:返回单词的数量

<li>{{ "check out django project more"|wordcount }}</li>

#output
5

63、wordwrap:用指定的行长包装单词。

{{ "django project more"|wordwrap:5 }}

64、yesno:将“true”、“false”和“可选”值映射到字符串“yes”、“否”、“可能”或以逗号分隔的列表传递的自定义映射,并根据值返回这些字符串中的一个字符串。

<li>{{ "True"|yesno:"yeah,no,maybe" }}</li>
<li>{{ "False"|yesno:"yeah,no,maybe" }}</li>

国际化标签和过滤器:

65、i18n:该库允许在模板中指定可翻译的文本。要启用它,请设置USE_I18NTrue,然后加载它 。{% loadi18n %}

66、l10n:该库提供对模板中值的本地化的控制。您只需要使用库加载库,但通常会默认设置为使本地化处于活动状态。{% load l10n %}USE_L10NTrue

67、tz:该库提供对模板中时区转换的控制。就像l10n,你只需要使用库加载,但通常也会设置为默认情况下转换为本地时间。{% load tz %}USE_TZTrue

其他标签和过滤器库:

Django附带了一些其他模板标签库,您必须在INSTALLED_APPS设置中明确启用该模板库,并在标签中启用模板。{% load %}

68、django.contrib.humanize:一组Django模板过滤器,可用于为数据添加“人体触摸”。请参阅 django.contrib.humanize

69、static:通过模板标签链接到保存在STATIC_ROOTDjango中的静态文件static。如果django.contrib.staticfiles 安装了应用程序,则标签将使用url()由指定的存储方法提供文件STATICFILES_STORAGE

70、get_static_prefix:更多控制STATIC_URL模板注入的位置和方式,则可以使用get_static_prefix模板标签

71、get_media_prefix:与此类似get_static_prefixget_media_prefix使用媒体前缀填充模板变量MEDIA_URL