一、模板介绍
模板是一个文本,用于分离文档的表现形式和内容。 模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签)。 模板通常用于产生HTML,但是Django的模板也能产生任何基于文本格式的文档。
创建文件夹:在应用中创建templates文件夹
创建文件:在templates文件夹中创建页面文件
模板语言包含如下内容:
二、变量
语法:{{variable}}
注意事项:
例如:
{{hero.showName}}
三、标签(标签和过滤器官方文档)
3.1、autoescape
控制当前的自动转义行为,此标记采用on或者off作为参数,并确定自动转义是否在块内有效。该块以endautoescape结束标签关闭。
{% autoescape on %} {{ body }} {% endautoescape %}
3.2、block
定义可以被子模板覆盖的块,为模板继承时使用
示例:
base.html
html>
lang="en">
charset="UTF-8">
Title
{% block head %}
{% endblock %}
logo
{% block content%}
abc
{% endblock %}
contact
index.html继承base.html
{% extends 'booktest/base.html' %} {% block content %} 123 {% endblock content %}
3.3、comment
注释,{% comment %} 和 {% endcomment %}之间的内容被解释为注释
3.4、crsf_token
一个防止CSRF攻击(跨站点请求伪造)的标签
3.5、cycle
多次循环迭代,给定的值,每次遇到此标签就会生成一个参数对应第一个,如此类推,如循环完没有参数了则继续从头开始循环。
{% cycle 'one' 'two' 'three' 'four' as infocycle %} {% cycle infocycle %} {% cycle infocycle %} {% cycle infocycle %} {% cycle infocycle %} {% cycle infocycle %} {% cycle infocycle %}
3.6、debug
输出整个调试信息,包括当前上下文和导入的模块。
3.7、extends
表示该模板扩展了父模板,这个标签有两种使用方式:
{% extends "base.html" %}
{% extends variable %}3.8、filter
通过一个或多个过滤器对内容过滤。 作为灵活可变的语法,多个过滤器被管道符号相连接,且过滤器可以有参数。
注意块中所有的内容都应该包括在filter 和endfilter 标签中。
{% filter force_escape|lower %} ... {% endfilter %}
3.9、firstof
输出第一个值不等于False的变量
{% firstof var1 var2 var3 %}
如果所有传递的变量都是False,还可以使用文字字符串作为返回值
{% firstof var1 var2 var3 "fallback value" %}
3.10、for
循环输出数组中的每个项目,使项目在上下文变量中可用。
循环列表的值:
{% for item in list %} {{ item }} {% endfor %}
可以使用reversed反向循环列表:
列表可以使用嵌套循环:{% for item in list reversed %} {{ item }} {% endfor %}
字典循环,可以使用items方法得到字典的建和值:{% for x in list %} {% for y in x %} {{ y }} {% endfor %} {% endfor %}
for循环再循环中设置的变量:{% for k,v in row.items %} {{ k }}={{ v }} {% endfor %}
{% for i in li %} {{ forloop.counter }}:{{ i }} {% endfor %}
{% for i in li %} {{ forloop.counter0 }}:{{ i }} {% endfor %}
{% for i in li %} {{ forloop.revcounter }}:{{ i }} {% endfor %}
{% for i in li %} {{ forloop.counter0 }}:{{ i }} {% endfor %}
{% for i in li %} {% if forloop.first %}
class="first"> {% else %} {% endfor %}{% endif %} {{ i }} {% for number in li %} {{ number }} {% if not forloop.last %} , {% endif %} {% endfor %}
for empty:如果给定的数组为空或无法找到,则for标签可以接受一个可选的子句,显示文本:{% empty %}
3.11、if{% for number in li1 %} {{ number }} {% empty %} sorry ,no number in this li1. {% endfor %}
条件语句
{{ po }} {% if po >= 90 %} 优秀:{{ po }} {% elif po >= 80 %} 良好:{{ po }} {% elif po >= 70 %} 一般:{{ po }} {% elif po >= 60 %} 及格:{{ po }} {% else %} 不及格:{{ po }} {% endif %}
说明:
3.12、ifchanged
检测一个值在循环的最后有没有改变,所以这个标签实在循环里面是用的,有两个用法:
{% for match in matches %}
style="background-color:
{% ifchanged match.ballot_id %}
{% cycle "red" "blue" %}
{% else %}
grey
{% endifchanged %}
">{{ match }}
{% endfor %}
3.13、ifequal
仅当两个参数相等的时候输出块的内容,可以配合else输出
{% ifequal user.username "adrian" %} ... {% endifequal %}3.14、ifnotequal
与ifequal相反
3.15、include
加载一个模板并用当前上下文(include该模板的模板的上下文)渲染它,接受一个变量或者字符串参数
当然你也可以在include的时候传递一些参数进来
{% include "name_snippet.html" with person="Jane" greeting="Hello" %}如果你只想接受传递的参数,不接受当前模板的上下文时,你可以是用only参数
{% include "name_snippet.html" with greeting="Hi" only %}3.16、load
加载标签库
3.17、now
显示当前的时间日期,接受格式化字符串的参数
3.18、regroup
通过共同的属性对一个列表的相似对象重新分组,加入你有一个城市(city)的列表如下
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 %}值得注意的是,regroup并不会重新排序,所以,请确保city在regroup之前已经按country排好序,否则将得不到你预期想要的结果,如果不确定可以用dictsort过滤器排序{% for country in country_list %} {{ country.grouper }}
{% for item in country.list %} {{ item.name }}: {{ item.population }} {% endfor %} {% endfor %}
{% regroup cities|dictsort:"country" by country as country_list %}3.19、spaceless
移除html标签之间的空格,注意是标签之间的空格,标签与内容之间的空格不会被删除
{% spaceless %}href="foo/">Foo {% endspaceless %}
结果如下:
3.20、ssi
在页面上输出给定文件的内容
{% ssi /home/html/ljworld.com/includes/right_generic.html %}使用parsed参数可以使得输入的内容可以作为一个模板从而可以使用当前模板的上下文
{% ssi /home/html/ljworld.com/includes/right_generic.html parsed %}3.21、url
反向解析
href="{% url 'booktest:show' '123' %}">
urlpatterns = [ path(r'admin/', admin.site.urls), path(r'booktest/', include('booktest.urls',namespace='booktest')), ]
3.22、widthratio
这个标签计算给定值与最大值的比率,然后把这个比率与一个常数相乘,返回最终的结果
src="bar.gif" height="10" width="{% widthratio this_value max_value 100 %}" />
3.23、
with
用更简单的变量名缓存复杂的变量名
{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}
尽管初衷是这样,但你不必都是如此,哈哈
{% with alpha=1 beta=2 %} ... {% endwith %}
四、过滤器(标签和过滤器官方文档)
4.1、add
给变量加上相应的值
{{ value|add:"2" }}此过滤器将首先尝试将这两个值强制为整数。如果失败,它会尝试将值加在一起。这将适用于某些数据类型(字符串,列表等),并在其他数据类型上失败。如果失败,结果将是一个空字符串。
4.2、addslashes
给变量中的引号(双引号、单引号)前加上斜线
{{ "i'm using django"|addslashes }} #输出为: i\'m using django4.3、capfirst
大写该值的第一个字符,如果第一个字符不是字母,则此过滤器不起作用。
{{ "i'm using django"|capfirst }} #输出为: I'm using django4.4、center
将值置于给定宽度的字段中
"{{ "django"|center:"30" }}"4.5、cut
从字符串中移除指定的字符
{{ "django"|cut:"j" }}4.6、 date
根据给定的格式格式化日期。
{{ date|date:"Y-m-d H:i:s w" }}Y:4位年;m:月;d:日;H:24小时时;i:分钟;s:秒;w:星期,从0开始表示星期日
4.7、default
如果变量值为false,则使用给定的默认值,否则使用该值。
{{ value|default:"nothing" }}4.8、 default_if_none
如果值是None,则使用给定的默认值,否则,使用该值。
{{ value|default_if_none:"nothing" }}4.9、 dictsort
根据参数中给出的关键字列出字典并返回该列表。
市场场景,可以更加某个属性进行数据排序重组:
[ {'title': '1984', '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 %}4.10、 dictsortreversed
获取字典列表并返回该列表按照参数中给出的建以相反顺序排序,这与上面的过滤器完全相同,但返回的值将按相反顺序排列。
4.11、divisibleby
是否能够被某个数字整除,是的话返回True,否则返回False
{{ 9|divisibleby:"3" }} #返回true4.12、 escape
对字符串进行转义。django默认自动转义,如果我们关闭了自动转义,这可使用escape过滤器来转义:
4.13、escapejs
替换value中的某些字符,以适应JAVASCRIPT和JSON格式
4.14、filesizeformat
格式化文件大小显示
{{ 123456|filesizeformat }} #输出: 120.6 KB4.15、 first
返回列表中的第一个值
{{ value|first }}4.16、 last
返回列表中的最后一个值
4.16、floatformat
格式化浮点数
4.17、force_escape
将HTML转义应用于字符串
4.18、get_digit
给定一个整数,返回请求的数字,其中1是最右边的数字,2是第二个最右边的数字等。返回无效输入的原始值(如果输入或参数不是整数,或者如果参数小于1)。否则,输出总是一个整数。
{{ po|get_digit:"2" }}4.19、 json
使用字符串链接列表元素
{{ lis|join:"++" }}4.20、 length
返回字符串或者列表的长度
{{ 'abcdefg'|length }}4.21、 length_is
比较字符串或者列表的长度
{{ 'abcdefg'|length_is:"7" }}4.22、 linebreaks
将纯文本中的换行符转换成HTML中的换行符。
value = ‘Joel\nis a slug’ {{ value|linebreaks }} #output: Joel is a slug4.23、 linebreaksbr
将纯文本中的所有换行符转换为HTML换行符。
4.24、linenumbers
用行号显示文本。
{{ value|linenumbers }}4.24、 lower
将字符串转换为全部小写。
{{ 'ABCD'|lower }}4.25、 make_list
返回转换为列表的值,将字符串转换为列表。
{{ value|make_list }} #output: ['D', 'j', 'a', 'n', 'g', 'o']4.26、 phone2numeric
将电话号码(可能包含字母)转换为数字等值。
{{ '800-COLLECT'|phone2numeric }} #output: 800-26553284.27、 pluralize
如果值不为1,则返回复数后缀,默认情况下,该后缀为‘s'。
4.28、pprint
一个包装,用于调试。
4.29、random
返回给定列表中的一个随机元素。
4.30、rjust
在给定宽度的字段中右对齐该值。
4.31、safe
将字符串标记为在输出之前不需要进一步的HTML转义,自动转义关闭时,此过滤器不起作用。
{{ value|safe }}4.32、 safeseq
将safe过滤器应用于序列的每一个元素,结合使用序列操作的其他过滤器很有用。
4.33、slice
返回列表的一部分,使用与python列表切片相同的语法。
lis = [1,2,3,4,5] {{ lis|slice:":2" }} #output [1, 2]4.34、 slugify
转换为ASCII。将空格转换为连字符。删除非字母数字,下划线或连字符的字符。转换大写为小写。也剥去前导和尾随空白。
value = ' Django IS %a *fsd_dsf-kkk ' {{ value|slugify }} #output: django-is-a-fsd_dsf-kkk4.35、 stringformat
根据参数格式化变量,这是一个字符串格式化说明符,说明符使用printf风格的字符串格式语法,除了前面的“%”。
value = 10.1 {{ value|stringformat:"d" }} #output: #输出整数 104.36、 striptags
去除所有HTML标签
value = "Joel is a slug" {{ value|striptags }} #output Joel is a slug4.37、 time
根据给定的时间格式,格式化输出时间
Y:4位年;m:月;d:日;H:24小时时;i:分钟;s:秒;w:星期,从0开始表示星期日
date = datetime.datetime.now() {{ date }} {{ date|time:"H:i:s" }} #output May 21, 2018, 12:33 p.m. 12:33:504.38、 timesince
将日期格式化为自该日期以来的时间(例如,“4天,6小时”)。
4.39、timeuntil
类似于timesince,除了它测量从现在开始直到给定日期或日期时间的时间
4.40、title
将字符串转换为标题,方法是让单词以大写字母开头,其余字符以小写字母开头。这个标签不会保留小写字母。
{{ "i am mr's zhang"|title }} #output I Am Mr's Zhang4.41、 truncatechars
如果字符串长于指定的字符数,则截断字符串。截断的字符串将以可转换的省略号序列(“...”)结尾。
{{ "i am mr's zhang"|truncatechars:5}} #output i ... #总长度保留5位
4.42、truncatechars_html
类似于truncatechars,它知道HTML标记。在截断点之后立即关闭在字符串中打开并且在截断点之前未关闭的任何标记。
4.43、truncatwords
在一定数量的单词之后截断一个字符串。
{{ "i am mr's zhang"|truncatewords:3}} #output i am mr's ...4.44、truncatewords_html
truncat类似于truncatewords,它知道HTML标记。任何在字符串中打开且在截断点之前未关闭的标记在截断后立即关闭。这比效率低truncatewords,因此只能在传递HTML文本时使用。ewords_html
4.45、unordered_list
递归地获取自嵌套列表并返回一个HTML无序列表 - 无需打开和关闭
var = ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']] {{ var|unordered_list }} #output States4.46、 upperKansas
Lawrence Topeka Illinois
将字符串转换为全部大写。
4.47、urlencode
转义在URL中使用的值。
var1 = "https://www.baidu.com/obj?a=b&b=d" {{ var1|urlencode }} {{ var1|urlencode:"" }} #当所有字符都应该转义时可使用空字符串 #output: https%3A//www.baidu.com/obj%3Fa%3Db%26b%3Dd https%3A%2F%2Fwww.baidu.com%2Fobj%3Fa%3Db%26b%3Dd4.48、 urlize
将文本中的网址和电子邮件地址转换为可点击的链接。
{{ "http://www.baidu.com"|urlize }} {{ "check out www.baidu.com"|urlize }} {{ "Send questions to [email protected]"|urlize }} #output http://www.baidu.com check out www.baidu.com Send questions to [email protected]4.49、 urlizetrunc
将URL和电子邮件地址转换为可点击链接,就像urlize一样,但会截断超过给定字符数限制的URL。
{{ "check out www.djangoproject.com more"|urlizetrunc:18 }} #output check out www.djangoproje... more4.50、 wordcount
返回单词的数量
{{ "check out django project more"|wordcount }} #output 54.51、 wordwrap
用指定的行长包装单词。
{{ "django project more"|wordwrap:5 }}4.52、yesno
将“true”、“false”和“可选”值映射到字符串“yes”、“否”、“可能”或以逗号分隔的列表传递的自定义映射,并根据值返回这些字符串中的一个字符串。
{{ "True"|yesno:"yeah,no,maybe" }} {{ "False"|yesno:"yeah,no,maybe" }}
五、注释
5.1、单行注释
{#...#}
5.2、多行注释
{% comment %} ... {% endcomment %}
六、自定义过滤器和标签
from django import template from django.utils.safestring import mark_safe # 名字必须为register register = template.Library() # 自定义过滤器 @register.filter def format_str(a, b): return a + "=%=" + b # 自定义标签 @register.simple_tag def my_tag(a, b, c): return a * b * c {% if '123'|format_str:'456' == '123=%=456' %} Hello Geek! {% else %} wtf {% endif %}