作者 | 单雨
责编 | 胡巍巍
媒介
为了实现模板封装和复用,提高 HTML 界面调试便捷性以及前后端解耦等方针,Django 界说了本身的收集模板说话。
当前介绍模板说话的官方文档已经非常完整,几乎涵盖了斥地中需要用到的常识点和需要注重的问题,但同时官方文档也存在一些问题:
翻译不敷完美,带来阅读的难题;
一些常识点的介绍过于简短,存在大量的页内链接,阅读时需要跳转到分歧的页面,阅读不连贯。
本文基于官方文档系统介绍了 Django 模板说话的根蒂常识点,轻易快速认识 Django 模板说话。
模板系统设计哲学
Django 的模板系统不是简洁的把 Python 嵌入到 HTML 中。
它的设计宗旨是:模板系统旨在展示内容 , 而不是法式逻辑,是以不在 HTML 页面中嵌入 Python。
简洁的说,模板只负责衬着数据,大多数逻辑应该交给视图(view)进行处理。
模板简介
模板是一个简洁的文本文件。它能够生成任何基于文本的花样(如 HTML,XML,CSV 等)。除了根基的 HTML 标签外,模板还包含两种额外的元素——变量和标签。
模板中包含的变量能够被替代为变量的值,标签则被替代为响应的模板掌握逻辑。示例:
django
{% extends "base_generic.html" %}
{% block title %}{{ section.title }}{% endblock %}
{% block content %}
<h1>{{ section.title }}</h1>
{% for story in story_list %}
<h2>
<a href="{{ story.get_absolute_url }}">
{{ story.headline|upper }}
</a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}
`{{ section.title }}` 在模板衬着时将会被变量的值替代,for 标签能够实现模板的轮回衬着。
根蒂语法
变量
变量实现从模板上下文字典(返回 HTTP 响应时传递过来的字典)中输出一个值,这是一个雷同于 dict 的对象,包含键值对。当模板引擎碰到一个变量时,它管帐算该变量,并用究竟替代它。
变量名由字母、数字字符和下划线 ( "_" ) 构成,但不克以下划线开首。点 ( "." ) 也显现在变量中,代表属性挪用,变量名中不克有空格或标点符号。
示例:
My first name is {{ first_name }}. My last name is {{ last_name }}.
当传入一个上下文字典 `{'first_name': 'John', 'last_name': 'Doe'}` 时,将会衬着获得:
My first name is John. My last name is Doe.
模板中的变量被字典中的值替代了。
变量还能够使用点透露法实现字典查找、属性查找和列表索引查找等把持:
{{ my_dict.key }}
{{ my_object.attribute }}
{{ my_list.0 }}
点透露法底层道理
当模板系统碰到一个点 , 它会按顺序测验下面的动作:
1. 字典查询
2. 属性或方式查找
3. 数字索引查询
若是究竟值是可挪用的,则挪用该值时将不带参数,挪用的究竟成为新的模板值。
当进行能笼盖字典查找的把持时,这种查找顺序或者会造成一些意想不到的行为。例如:若是试图轮回一个 collection .defaultdict 字典对象:
{% for k, v in defaultdict.items %}
{ 其他把持 }
{% endfor %}
因为字典查找是首先发生的,所以这个行为会先供应一个默认值,而不是使用预期的 .items ( ) 方式。在这种情形下,应该首先考虑使用字典查找,而不是使用字典的属性挪用。
注重
属性平日被注释为一个文本字符串,防止和同名的变量辩说。例如 {{foo.bar}} 中的属性 "bar" 将被注释为一个文本字符串,若是模板上下文中存在变量 "bar",则不会使用该变量的值。
以下划线开首的变量属性或者不克接见,因为它们平日被认为是私有的。
若是引用不存在的变量,模板系统将插入 string_if_invalid 选项的值,该选项默认设置为 "" ( 空字符串 ) 。
标签
标签在模板衬着过程中供应随意逻辑。标签能够输出内容,作为掌握构造,例如 "if" 语句或 "for" 轮回,从数据库获取内容,甚至许可接见其他模板标签。
(1)标签声明
标签的一样形式为:
{% tag %}
{% csrf_token %}
(2)传入参数
{% cycle 'odd' 'even' %}
(3)成对使用的标签
有些标签需要起头和竣事标签:
{% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}
(4)常用标签
for:轮回数组中的每个元素 . 好比 , 显露列表 `athlete_list` 中每个元素的 `name` 属性。
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
if 、elif 和 else:在上面,若是 athlete_list 不为空,则 {{athlete_list|length}} 变量将显露活动员的数量。
不然,若是 athlete_in_locker_room_list 不为空,则会显露 "Athletes should be out … " 新闻。若是两个列表都为空,则显露 "No athletes"。
也能够在 if 标签里使用过滤器和各类把持符:
{% if athlete_list|length > 1 %}
Team: {% for athlete in athlete_list %} ... {% endfor %}
{% else %}
Athlete: {{ athlete_list.0.name }}
{% endif %}
固然上面的示例能够工作,然则要注重,大多数模板过滤器都返回字符串,是以使用过滤器进行数学对照平日不会正常工作,而长度是个破例。
(5)更多
Django 有好多内置标签,更多关于内置标签的信息请参考官方文档:
https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/ref-templates-builtins-tags
若是需要编写自界说标签,请参考官方文档
https://docs.djangoproject.com/zh-hans/2.2/howto/custom-template-tags/howto-writing-custom-template-tags
若是需要对使用的标签和自界说的标签做一份解说文档,能够使用 Django 供应的文档对象,详情请参考:
https://docs.djangoproject.com/zh-hans/2.2/ref/contrib/admin/admindocs/
过滤器
简介
过滤器能够对变量做一些把持,例如给变量赋值,改变变量的值等。
点窜变量显露
过滤器能够点窜变量的显露。例如:
{{ name|lower }}
经由过滤器 lower 变量 {{ name }} 变为了小写字符,经由管道符 ( | ) 距离变量和过滤器来使用过滤器。
链式挪用过滤器
一个过滤器的输出能够作为下一个过滤器的输入。
{{ text|escape|linebreaks }} 是一种常用的转换体式 , 在这之后换行符被替代为了 <p> 标签。
转换变量和标签参数
过滤器转换变量和标签参数的值。示例:
{{ django|title }}
传入 `{'django': 'the web framework for perfecalist With deadline '}` 上下文字典时,该模板呈现为:
The Web Framework For Perfectionists With Deadlines
传入参数给过滤器
示例 1:
{{ my_date|date:"Y-m-d" }}
my_date 将会被替代为当前日期。
示例 2:
django
{{ bio|truncatewords:30 }}
将会会显露 `bio` 变量的前 30 个字符
注重
过滤器参数中若是包含空格和标点符号,必需使用引号 "" 括起来,例如,要用逗号和空格保持列表,能够使用 {{list|join:", "}}。
Django 供应了大约 60 个内置模板过滤器,请参考官方文档:
https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/ref-templates-builtins-filters,
下面列举一些常用的过滤器:
default
若是变量为 false 或空,则使用给定的默认值。不然,使用变量的值。例如:
{{ value|default:"nothing" }}
若是 `value` 没有供应或许为空,那么将它显露为 "`nothing`" 。
length
返回值的长度。这对字符串和列表都适用。例如:
{{ value|length }}
若是 `value` 为 ` [ 'a', 'b', 'c', 'd' ] `, 那么他将被显露为 `4`。
filesizeformat
将值花样化为 " 人类可读的 " 文件巨细 ( 即 "13kb"、"4.1 MB"、"102 字节 " 等 ) 。例如:
{{ value|filesizeformat }}
若是值为 123456789,则输出为 117.7 MB。
若是需要自界说过滤器,请参考请官方文档:
https://docs.djangoproject.com/zh-hans/2.2/howto/custom-template-tags/
注释
单行注释
{ this won't be rendered }
多行注释:{% comment %} 和 {% endcomment %}
<p>Rendered text with {{ pub_date|date:"c" }}</p>
{% comment "Optional note" %}
<p>Commented out text with {{ create_date|date:"c" }}</p>
{% endcomment %}
注重:Comment 标签不克嵌套使用。
作者简介:单雨,90 后工科男,伪文艺青年。今朝就读于北京理工大学宇航系,喜欢研究 AI,收集爬虫,微信小法式以及机械人,痴迷于 Coding,睡前必撸码。