Django 的模板语言
文章目录
模板语法
模板 是和 上下文 一起呈现的。
有四种语法结构。
Variables 变量
变量是 context 里的键 {{ key }}
关联属性查找用.
号
字典查找 {{ key.key }}
属性查找 {{ keyattr }}
index 查找{{ key.0 }}
如果变量是可调用的,模板系统会自己调用它并用返回值替换。
Tags 标签
标签在渲染过程中提供任意逻辑。{% and %}
可以是个函数
{% csrf_token %}
tags 可以接受参数
{% cycle 'odd' 'even' %}
有的需要开始和结束tags
{% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}
Filters 过滤器
过滤器转换变量和标记参数的值。{{ django|title}}
这个会把 {‘django’: ‘the web framework for perfectionists with deadlines’} 首字符大写;
有的需要参数
{{ my_date|date:"Y-m-d" }}
Comments
{# this won’t be rendered #}
{% comment %}
内置 tags 和 filters
内置 24 个 tag
tag | 参数 | 用途 | 例子 | 备注 |
---|---|---|---|---|
autoescape | on/off | 去除 html 标签 | {% autoescape on %}{{ body }}{% endautoescape %} | |
block | 子模板重写 | |||
comment | 评论 | |||
csrf_token | CSRF protection | |||
cycle | 备选变量 | 循环使用备选变量的内容 | {% for o in some_list %}<tr class="{% cycle 'row1' 'row2' as rowcolors %}"></tr>{% endfor %} | as 重命名 |
debug | 调试信息 | |||
extends | 父模板名 | 重用模板 | {% extends "./base2.html" %} | 相对.路径 |
filter | 过滤器名 | 过滤 | {% filter force_escape|lower %}This text will be HTML-escaped, and will appear in all lowercase.{% endfilter %} | |
firstof | var1 var2 var3 | 返回第一个True变量 | {% firstof var1 var2|safe var3 "<strong>fallback value</strong>"|safe %} | 全假返回最后的字符串 |
for | 循环列表,字典 | {% for obj in list reversed %} 逆序 | ||
if | 条件语句 | if elif else endif | 支撑 and or not 以及 == <> is in 等比较运算符 | |
ifchanged | 是否改变 | {% for date in days %}{% ifchanged date.date %} {{ date.date }} {% endifchanged %}{% endfor %} | 只能用在 for 循环里 | |
include | 模板名 | 嵌套模板 | {% include "name_snippet.html" with person="Jane" greeting="Hello" %} | 参数不全可用 only |
load | tagset | 加载标签集 | {% load somelibrary package.otherlibrary %} | {% load foo bar from somelibrary %} 指定 tag |
lorem | count method random | 随机文字填充 | {% lorem 2 w random %} | w words p paragraphs b text |
now | 格式 | 当前时间 | {% now "Y" as current_year %} | |
regroup | 分组 | 分组可过滤器排序 | ||
resetcycle | 重置 cycle | 与cycle共用 | ||
spaceless | 移除 html 空格 | end | ||
templatetag | openblock closeblock openvariable closevariable openbrace closebrace opencomment closecomment | 转义 | {% templatetag openblock %} url 'entry_list' {% templatetag closeblock %} | |
url | 反推url | {% url 'some-url-name' v1 v2 %} | {% url 'some-url-name' arg1=v1 arg2=v2 %} 避免硬编码 as 重命名 | |
verbatim | 取消模板功能用原始字符串 | |||
widthratio | 按比计算宽度 | {% widthratio this_value max_value max_width %} | ||
with | 保存复杂计算结果重用 | {% with business.employees.count as total %}{{ total }} employee{{ total|pluralize }}{% endwith %} | {% with alpha=1 beta=2 %} |
如果列表为空使用 for…empty
<ul>{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>{% empty %}
<li>Sorry, no athletes in this list.</li>
{% endfor %}
</ul>
forloop.counter 计数器 从1开始
forloop.counter0 计数器 从0开始
forloop.first True 首次
forloop.last
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>
内置 filter 过滤器
filter | 参数 | 用途 | 例子 | from | to |
---|---|---|---|---|---|
add | str list | 加法 连列表 | {{ value|add:"2" }} | ||
addslashes | I’m | I\'m | |||
capfirst | django | Django | |||
center | 长度 | 中心对齐 | {{ value|center:"15" }} | ||
cut | str | 删除字符 | {{ value|cut:" " }} | ||
date | 日期格式 | {{ value|date:"D d M Y" }} {{ value|time:"H:i" }} | |||
default | False 替换 | {{ value|default:"nothing" }} | |||
default_if_none | None 替换 | ||||
dictsort | key | 字典列表按key排序 元组列表按位置排序 | {{ value|dictsort:"name" }} {{ value|dictsort:0 }} | ||
dictsortreversed | 逆序同上 | ||||
divisibleby | 能否被整除 | {{ value|divisibleby:"3" }} | 21 | True | |
escape | 转义 | < | < | ||
escapejs | |||||
filesizeformat | 文件大小友好格式 | 123456789 | 117.7MB | ||
first | 首元素 | ||||
floatformat | 精度默认1 | 浮点数格式化 | |||
force_escape | 强制转义 | ||||
get_digit | 默认1 | 返回右数第n位 | {{ value|get_digit:"2" }} | 1234 | 3 |
iriencode | ?test=1&me=2 | ?test=1&me=2 | |||
join | 连字符 | {{ value|join:" // " }} | [‘a’,'b,‘c’] | ‘a//b//c’ | |
json_script | 字典转 json | {{ value|json_script:"hello-data" }} | {‘hello’: ‘world’} | <script id="hello-data" type="application/json">{"hello": "world"}</script> | |
last | 尾元 | ||||
length | 长度 | ||||
length_is | 长度断言 | ||||
linebreaks | 换行转<br> | Joel\nis a slug | <p>Joel<br>is a slug</p> | ||
linebreaksbr | 换行转<br> | Joel\nis a slug | Joel<br>is a slug | ||
linenumbers | 加行号 | one | 1.one | ||
ljust | 长度 | 左对齐 空格补 | {{ value|ljust:"10" }} | ||
lower | 小写 | ||||
make_list | 转列表 | ‘abc’ 123 | [‘a’,‘b’,‘c’] [‘1’,‘2’,‘3’] | ||
pluralize | 复数后缀s | ||||
pprint | debug | ||||
random | 列表随机选 | ||||
rjust | |||||
safe | 无需转义 | ||||
safeseq | 序列无需转义 | {{ some_list|safeseq|join:", " }} | |||
slice | 同切片 | {{ some_list|slice:":2" }} | |||
slugify | Joel is a slug | joel-is-a-slug | |||
striptags | 去掉所有html标签 | ||||
time | |||||
timesince | 时间间隔 | {{ blog_date|timesince:comment_date }} | |||
timeuntil | 所剩余时间 | {{ conference_date|timeuntil:from_date }} | |||
title | 标题化 | my FIRST post | My First Post | ||
truncatechars | 按字符截断长度 | {{ value|truncatechars:7 }} | |||
truncatewords | 按单词截断长度 | {{ value|truncatewords:7 }} | |||
truncatewords_html | 截断保留最后的 html 标签 | ||||
unordered_list | 将内嵌的列表转成无序列表格式 | ||||
upper | 大写 | ||||
urlencode | url转码 | ||||
urlize | 把url转换成可点击的 | www.django.com | <a href="http://www.django.com" rel="nofollow">www.djangoproject.com</a> | ||
wordcount | 单词计数 | ||||
wordwrap | N | 单词打包 每行N个 | |||
yesno | True False None 转换 | {{ value|yesno:"yeah,no,maybe" }} | True | yeah |
使用 filter 的好处是不用自己在视图里计算出结果再传递给 context
其他 tags 和 filter
django.contrib.humanize
{% load static %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!">
使用 STATIC_URL
{% get_static_prefix as STATIC_PREFIX %}
<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!">
使用 MEDIA_URL
<body data-media-url="{% get_media_prefix %}">