1. 标签 {% tag %}
1.1 block
标签
block
有开始和结束标签,用于定义一个可以被子模板覆盖的块。
{% block content %}{% endblock %}
1.2 comment
标签
comment
有开始和结束标签,用于多行注释。可以在开始标签中插入注释的原因。comment
不能嵌套。
{% comment "Optional note" %}
<p>Hello, Django!</p>
{% endcomment %}
1.3 for
标签
for
有开始和结束标签,用于遍历数组。
<ul>
{% for student in students %}
<li>{{ student.name }}</li>
{% endfor %}
</ul>
1.4 for ... empty
标签
empty
标签配合 for
标签使用,用于指定当 for
循环的数组为空或不存在时显示的备用内容。
<ul>
{% for student in students %}
<li>{{ student.name }}</li>
{% empty %}
<li>Sorry, no student in this list.</li>
{% endfor %}
</ul>
1.5 cycle
标签
cycle
标签在 for
循环中很有用。用于循环生成给定的几个值。
<ul>
{% for student in students %}
<li class="{% cycle 'odd' 'even' %}">{{ student.name }}</li>
{% endfor %}
</ul>
1.6 debug
标签
用于调试的标签。
{% debug %}
1.7 extends
标签
用于模板继承,表示该模板扩展了一个父模板。
{% extends "base.html" %}
1.8 filter
标签
filter
有开始和结束标签,通过一个或多个过滤器过滤开始和结束标签中间的内容。
{% filter title|linebreaks %}the Django REST framework{% endfilter %}
{# => <p>The Django Rest Framework</p> #}
1.9 if
标签
-
if
标签可以带多个elif
分支和一个else
分支,但是最后都要以endif
标签结束。用于条件判断。 - 布尔操作:
and
、or
、not
-
if
标签中还可以使用过滤器
{% if students|length > 3 %}
There are more than 3 students.
{% endif %}
1.10 lorem
标签
用于随机生成一段拉丁文文本。
lorem
标签可以带三个参数:
-
count
:要生成的段落或单词的数量,默认为1
; -
method
:要生成的文本类型,单词为w
,HTML 段落为p
,纯文本段落块为b
,默认为b
; -
random
:在生成文本时不使用普通段落。
{% lorem 3 w random %}
{# => laboriosam eligendi expedita #}
1.11 now
标签
按照给定的格式显示当前日期时间。
{% now 'SHORT_DATETIME_FORMAT' %}
1.12 spaceless
标签
删除 HTML 标签之间的空白,包括制表符和换行符。但不会删除标签和文本之间的空格。
{% spaceless %}
<p>
<a href="#">Django
Rest Framework
</a>
</p>
{% endspaceless %}
{% comment "result:" %}
<p><a href="#">Django
Rest Framework
</a></p>
{% endcomment %}
2. 注释
- 多行注释:
comment
标签 - 单行注释:
{# comment #}
{# 单行注释 #}
3. 模板继承
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %} Default title {% endblock %}</title>
</head>
<body>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog/">Blog</a></li>
<li><a href="/about/">About</a></li>
</ul>
</nav>
<div class="content">
{% block content %} default content {% endblock %}
</div>
</body>
</html>
上面这个模板文件中,用 block
标签定义了两个可以被子模板覆盖的区域:title
和 conent
。如果在子模板中没有对应名称的 block
标签,最终输出的结果就是父模板中的内容。
在子模板中,使用 extends
标签来引用模板:
{% extends './base.html' %}
{% block title %}Home{% endblock %}
{% block content %}
<p>Hello, Django!</p>
{% endblock %}
然后用两个 block
标签替换了父模板中的默认内容。因此最终输出的结果如下:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Home</title>
</head>
<body>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog/">Blog</a></li>
<li><a href="/about/">About</a></li>
</ul>
</nav>
<div class="content">
<p>Hello, Django!</p>
</div>
</body>
</html>
3.1 模板继承使用要点
- 在子模板中使用
{% extends %}
时,它必须是该模板中的第一个模板标签。否则,将无法使用模板继承。 - 如果有的内容在多个模板中重复出现,那就应该把这些内容移到父模板的
{% block %}
中。 - 同一个模板中的
block
标签不能重名。 - 为了增加可读性,可以给每个
{% endblock %}
标签也写上名字。
{% block content %}
<p>Hello, Django!</p>
{% endblock content %}