一.简介
它可以产生任何基于文本的的格式(HTML,XML,CSV等等)。
模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签。
例:
{% 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 %}
二.使用
1.变量
格式:
{{ variable }}
变量命名规则
1.变量的命名包括任何字母数字以及下划线 ("_")的组合
2.不能在变量名称中使用空格和标点符号
- 字典查询(Dictionary lookup)
- 属性或方法查询(Attribute or method lookup)
- 数字索引查询(Numeric index lookup)
例;
{#如果后台 渲染传过来的是字典格式的数据 那么前端页面解析值 dict={"k1":"v1"} 假设传的是{"dict": dict} 前端页面取值 .字典key值#}
<h1>{{dict.k1}}</h1>
2.过滤器
可以通过使用 过滤器来改变变量的显示
格式:
{{ name|lower }}
管道符过滤,一个过滤器的输出将被应用到下一个
过滤器参数;
{{ item.content |truncatewords:30 }} <!-- 只显示 content 变量的前30个词 -->
default
{{ value|default:"nothing" }} <!--如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值-->
length
它对字符串和列表都起作用
{{ value|length }}
filesizeformat
将该数值格式化为一个 “人类可读的” 文件容量大小 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)
{{ value|filesizeformat }}
add
把add后的参数加给value
{{ value|add:"2" }} <!--如果 value 为 4,则会输出 6.-->
capfirst
将变量首字母变大写
{{ value|capfirst }} <!--如果value是test过滤后转为Test-->
cut
移除value中所有的与给出的变量相同的字符串
{{ value|cut:" " }}
dictsort
根据指定的key值对列表字典排序,并返回
{{ value|dictsort:"name" }}
如,给定的值是:
[ {'name': 'peter', 'age': 19}, {'name': 'amy', 'age': 22}, {'name': 'jim', 'age': 31}, ]
那么结果将是;
[ {'name': 'amy', 'age': 22}, {'name': 'jim', 'age': 31}, {'name': 'peter', 'age': 19}, ]
也可以处理较为复杂的;
{% for book in books|dictsort:"author.age" %}
* {{ book.title }} ({{ book.author.name }})
{% endfor %}
如给定值为:
[ {'title': '1984', 'author': {'name': 'George', 'age': 45}}, {'title': 'Timequake', 'author': {'name': 'Kurt', 'age': 75}}, {'title': 'Alice', 'author': {'name': 'Lewis', 'age': 33}}, ]
那么结果为:
* Alice (Lewis) * 1984 (George) * Timequake (Kurt)
random
随机返回一个值
{{ value|random }}
如果 value 是 列表 ['a', 'b', 'c', 'd'], 可能输出的是 "b"
slice
切片
{{ some_list|slice:":2" }}
如果 some_list 是 ['a', 'b', 'c'], 输出结果为 ['a', 'b']
truncatewords
字符串截断
{{ value|truncatewords:2 }}
如果 value 是 "Joel is a slug",输出 "Joel is ...".
3.标签
格式
{% tag %}
简介
标签比变量复杂得多:有些用于在输出中创建文本,有些用于控制循环或逻辑,有些用于加载外部信息到模板中供以后的变量使用。
有些标签需要开始标签和结束标签(例如{% tag %} ... tag contents ... {% endtag %})
常用标签;
for标签
格式
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
if,elif and else
计算一个变量,并且当变量是“true”时,显示块中的内容
格式:
{% if athlete_list %}
Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
Athletes should be out of the locker room soon!
{% else %}
No athletes.
{% endif %}
4.注释
要注释模版中一行的部分内容,使用注释语法 {# #}
三.模版继承
模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。
例;
<!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="style.css" /> <title>{% block title %}My amazing site{%/span> endblock %}</title> </head> <body> <div id="sidebar"> {% block sidebar %} <ul> <li><a href="/">Home</a></li> <li><a href="/blog/">Blog</a></li> </ul> {% endblock %} </div> <div id="content"> {% block content %}{% endblock %} </div> </body> </html>
“子模版”的工作是用它们的内容填充空的blocks
子模版可能看起来是这样的:
{% extends "base.html" %}/span> {% block title %}My amazing blog{% endblock %} {% block content %} {% for entry in blog_entries %} <h2>{{ entry.title }}</h2> <p>{{ entry.body }}</p> {% endfor %} {% endblock %}
当模版系统处理这个模版时,首先,它将定位父模版——在此例中,就是“base.html”。
blog_entries 的值,输出可能看起来是这样的:
<!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="style.css" /> <title>My amazing blog</title> </head> <body> <div id="sidebar"> <ul> <li><a href="/">Home</a></li> <li><a href="/blog/">Blog</a></li> </ul> </div> <div id="content"> <h2>Entry one</h2> <p>This is my first entry.</p> <h2>Entry two</h2> <p>This is my second entry.</p> </div> </body> </html>
使用继承的一个常用方式是类似下面的三级结构:
- base.html 模版来控制您整个站点的主要视觉和体验。
- base.html ,并且包含了每部分特有的样式和设计。
- 这些模版继承对应分支的模版
母版结构
{% block content %}
...
{% endblock content %}
四.自动HTML转义
明确地说,下面五个字符被转义:
- <
- >
- '
- "
- &
如何关闭
autoescape标签 中
{% autoescape off %}
Hello {{ name }}
{% endautoescape %}
下面是一个模板的示例:
Auto-escaping is on by default. Hello {{ name }}
{% autoescape off %}
This will not be auto-escaped: {{ data }}.
Nor this: {{ other_data }}
{% autoescape on %}
Auto-escaping applies again: {{ name }}
{% endautoescape %}
{% endautoescape %}
例如:
{% autoescape off %} <h1>{% block title %}{% endblock %}</h1> {% block content %} {% endblock %} {% endautoescape %}