模板 是和 上下文 一起呈现的。
有四种语法结构。
变量是 context 里的键 {{ key }}
关联属性查找用.
号
字典查找 {{ key.key }}
属性查找 {{ keyattr }}
index 查找{{ key.0 }}
如果变量是可调用的,模板系统会自己调用它并用返回值替换。
标签在渲染过程中提供任意逻辑。{% and %}
可以是个函数
{% csrf_token %}
tags 可以接受参数
{% cycle 'odd' 'even' %}
有的需要开始和结束tags
{% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}
过滤器转换变量和标记参数的值。{{ django|title}}
这个会把 {‘django’: ‘the web framework for perfectionists with deadlines’} 首字符大写;
有的需要参数
{{ my_date|date:"Y-m-d" }}
{# this won’t be rendered #}
{% comment %}
tag | 参数 | 用途 | 例子 | 备注 |
---|---|---|---|---|
autoescape | on/off | 去除 html 标签 | {% autoescape on %}{{ body }}{% endautoescape %} |
|
block | 子模板重写 | |||
comment | 评论 | |||
csrf_token | CSRF protection | |||
cycle | 备选变量 | 循环使用备选变量的内容 | {% for o in some_list %} |
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 "fallback value"|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 | 参数 | 用途 | 例子 | 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’} |
|
|
last | 尾元 | ||||
length | 长度 | ||||
length_is | 长度断言 | ||||
linebreaks | 换行转
|
Joel\nis a slug |
|
||
linebreaksbr | 换行转
|
Joel\nis a slug | Joel |
||
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 | www.djangoproject.com |
||
wordcount | 单词计数 | ||||
wordwrap | N | 单词打包 每行N个 | |||
yesno | True False None 转换 | {{ value|yesno:"yeah,no,maybe" }} |
True | yeah |
使用 filter 的好处是不用自己在视图里计算出结果再传递给 context
django.contrib.humanize
{% load static %}
使用 STATIC_URL
{% get_static_prefix as STATIC_PREFIX %}
使用 MEDIA_URL