Django模板语言

Django模板是一个string文本,它用来分离一个文档的展现和数据。模板定义了placeholder和表示多种逻辑的tags来规定文档如何展现,通常模板用来输出HTML,但是Django模板也能生成其它基于文本的形式。

◇◆◇◆◇

###
变量

变量的引用

{{  变量名 }}

Template和Context对象

点击这里,查看例子
>>> python manage.py shell  (进入该django项目的环境)
>>> from django.template import Context, Template
>>> t = Template('My name is {{ name }}.')
>>> c = Context({'name': 'Stephane'})
>>> t.render(c)
'My name is Stephane.'


# 同一模板,多个上下文,一旦有了模板对象,你就可以通过它渲染多个context,无论何时我们都可以
# 像这样使用同一模板源渲染多个context,只进行 一次模板创建然后多次调用render()方法渲染会
# 更为高效:
# Low
for name in ('John', 'Julie', 'Pat'):
t = Template('Hello, {{ name }}')
print t.render(Context({'name': name}))

# Good
t = Template('Hello, {{ name }}')
for name in ('John', 'Julie', 'Pat'):
print t.render(Context({'name': name}))

变量的查找

我们通过 context 传递的简单参数值主要是字符串,然而,模板系统能够非常简洁地处理更加复杂的数据结构,例如list、dictionary和自定义的对象。在 Django 模板中遍历复杂数据结构的关键是句点字符 .

点击这里,查看例子
# 首先,句点可用于访问列表索引,例如:
>>> from django.template import Template, Context
>>> t = Template('Item 2 is {{ items.2 }}.')
>>> c = Context({'items': ['apples', 'bananas', 'carrots']})
>>> t.render(c)
'Item 2 is carrots.'

#假设你要向模板传递一个 Python 字典。 要通过字典键访问该字典的值,可使用一个句点:
>>> from django.template import Template, Context
>>> person = {'name': 'Sally', 'age': '43'}
>>> t = Template('{{ person.name }} is {{ person.age }} years old.')
>>> c = Context({'person': person})
>>> t.render(c)
'Sally is 43 years old.'

#同样,也可以通过句点来访问对象的属性。 比方说, Python 的 datetime.date 对象有
#year 、 month 和 day 几个属性,你同样可以在模板中使用句点来访问这些属性:

>>> from django.template import Template, Context
>>> import datetime
>>> d = datetime.date(1993, 5, 2)
>>> d.year
>>> d.month
>>> d.day
>>> t = Template('The month is {{ date.month }} and the year is {{ date.year }}.')
>>> c = Context({'date': d})
>>> t.render(c)
'The month is 5 and the year is 1993.'

# 这个例子使用了一个自定义的类,演示了通过实例变量加一点(dots)来访问它的属性,这个方法适
# 用于任意的对象。
>>> from django.template import Template, Context
>>> class Person(object):
... def __init__(self, first_name, last_name):
... self.first_name, self.last_name = first_name, last_name
>>> t = Template('Hello, {{ person.first_name }} {{ person.last_name }}.')
>>> c = Context({'person': Person('John', 'Smith')})
>>> t.render(c)
'Hello, John Smith.'

# 点语法也可以用来引用对象的方法。 例如,每个 Python 字符串都有 upper() 和 isdigit()
# 方法,你在模板中可以使用同样的句点语法来调用它们:
>>> from django.template import Template, Context
>>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}')
>>> t.render(Context({'var': 'hello'}))
'hello -- HELLO -- False'
>>> t.render(Context({'var': '123'}))
'123 -- 123 -- True'

# 注意这里调用方法时并* 没有* 使用圆括号 而且也无法给该方法传递参数;你只能调用不需参数的

标签

if/else 标签

{% if condition1 %}
... display 1
{% elif condiiton2 %}
... display 2
{% else %}
... display 3
{% endif %}

if 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not ).
注意:

if 标签不允许在同一个标签中同时使用 and 和 or ,因为逻辑上可能模糊的,这样的代码是不合法的:

{% if athlete_list and coach_list or cheerleader_list %}

系统不支持用圆括号来组合比较操作。 如果你确实需要用到圆括号来组合表达你的逻辑式,考虑将它移到模板之外处理,然后以模板变量的形式传入结果吧。 或者,仅仅用嵌套的if标签替换.

for 标签

for 允许我们在一个序列上迭代,循环语法是 for X in Y ,Y是要迭代的序列而X是在每一个特定的循环中使用的变量名称。每一次循环中,模板系统会渲染在 for 和 endfor 之间的所有内容。

 <ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
反向迭代

给标签增加一个 reversed 使得该列表被反向迭代:

{% for athlete in athlete_list reversed %}

empty分句

for 标签支持一个可选的empty 分句,通过它我们可以定义当列表为空时的输出内容。

{% for athlete in athlete_list %}
<p>{{ athlete.name }}</p>
{% empty %}
<p>There are no athletes. Only computer programmers.</p>
{% endfor %}
退出循环

Django不支持退出循环操作。 如果我们想退出循环,可以改变正在迭代的变量,让其仅仅包含需要迭代的项目。 同理,Django也不支持continue语句,我们无法让当前迭代操作跳回到循环头部。

forloop变量

在每个for循环里有一个称为forloop 的模板变量。这个变量有一些提示循环进度信息的属性。forloop 变量仅仅能够在循环中使用。 在模板解析器碰到endfor标签后,forloop就不可访问了。

forloop.counter 总是一个表示当前循环的执行次数的整数计数器。 这个计数器是从1开始的,所以在第一次循环时forloop.counter 将会被设置为1。

{% for item in todo_list %}
<p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}

forloop.counter0 类似于forloop.counter ,但是它是从0计数的。 第一次执行循环时这个变量会被设置为0。

forloop.revcounter 是表示循环中剩余项的整型变量。 在循环初次执行时forloop.revcounter 将被设置为序列中项的总数。 最后一次循环执行中,这个变量将被置1。

forloop.revcounter0 类似于forloop.revcounter ,但它以0做为结束索引。在第一次执行循环时,该变量会被置为序列的项的个数减1。

forloop.first 是一个布尔值,如果该迭代是第一次执行,那么它被置为True.

forloop.last 是一个布尔值;在最后一次执行循环时被置为True。

一个常见的用法是在一系列的链接之间放置管道符|,另一个常见的用途是为列表的每个单词的加上逗号。

{% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}

上面的模板可能会产生如下的结果:

Link1 | Link2 | Link3 | Link4

ifequal/ifnotequal 标签

ifequal 标签比较两个值,当他们相等时,显示在 ifequalendifequal 之中所有的值。

下面的例子比较两个模板变量 user 和 currentuser :

{% ifequal user currentuser %}
<h1>Welcome!</h1>
{% else %}
<h1>Sorry</h1>
{% endifequal %}

只有模板变量,字符串,整数和小数可以作为 ifequal 标签的参数。其他任何类型,例如Python的字典类型、列表类型、布尔类型,不能用在ifequal

注释标签

单行注释
{# 这是一个注释 #}

用这种语法的注释不能跨越多行。 这个限制是为了提高模板解析的性能。

多行注释
{% comment %}
This is a
multi-line comment.
{% endcomment %}

URL标签

url的用法也很简单,只要在urlpatterns里使用它,附加一个name,如:

url(r'^article$','news_index' ,name="news_index"),

Templates里 这样使用

{%url 'name'%}

地址链接就能使用了。

name是全局的,你整个urlpatterns里只能一个唯一的name,这个道理应该好理解,就像网站的地址也是唯一性的。

csrf_token标签

用于生成csrf_token的标签,用于防治跨站攻击验证。注意如果你在view的index里用的是render_to_response方法,不会生效。
其实,这里是会生成一个input标签,和其他表单标签一起提交给后台的

引用路由配置的地址

这里的参数来自urls.py中的定义的name=xxxx

<form action="{% url "xxxx"%}" >
<input type="text">
<input type="submit"value="提交">
{%csrf_token%}
</form>

禁止渲染

{% verbatim %}
{{ hello }}
{% endverbatim %}

加载标签

{% load xxxx %}

过滤器

过滤器通过管道符来实现。

add

给value加上一个数值

{{ user.age | add:”5” }}

capfirst

第一个字母大写

{{ ‘good’| capfirst }} 返回”Good”

center

输出指定长度的字符串,把变量居中

{{ “abcd”| center:”50” }}

cut

删除指定字符串

{{ “You are not a Englishman” | cut:”not” }}

dictsort

按某字段排序,变量必须是一个dictionary

{% for moment in moments | dictsort:”id” %}

default

如果值不存在,则使用默认值代替

{{ value | default:”(N/A)” }}

filesizeformat

增加数字的可读性,转换结果为13KB,89MB,3Bytes等

{{ 1024 | filesizeformat }} 返回 1.0KB

floatformat

转换为指定精度的小数,默认保留1位小数

{{ 3.1415926 | floatformat:3 }} 返回 3.142  四舍五入

get_digit

从个位数开始截取指定位置的数字

{{ 123456 | get_digit:’1’}}

linebreaks

<p>或<br>标签包裹变量

{{ “Hi\n\nDavid”|linebreaks }} 返回<p>Hi</p><p>David</p>

ljust

输出指定长度的字符串,变量左对齐

{{‘ab’|ljust:5}}	返回 ‘ab   ’

slice

切片操作, 返回列表

{{[3,9,1] | slice:’:2’}} 	返回 [3,9]
{{ 'asdikfjhihgie' | slice:':5' }} 返回 ‘asdik’

slugify

在字符串中留下减号和下划线,其它符号删除,空格用减号替换

{{ '5-2=3and5 2=3' | slugify }} 	返回 5-23and5-23

truncatewords

将字符串转换为省略表达方式

{{ 'This is a pen' | truncatewords:2 }}
返回 This is ...

truncatewords_html

同上,但保留其中的HTML标签

{{ '<p>This is a pen</p>' | truncatewords:2 }}
返回 <p>This is ...</p>

yesno

将布尔变量转换为字符串yes, no 或maybe

{{ True | yesno }}		yes
{{ False | yesno }} no
{{ None | yesno }} maybe

其他过滤器

过滤器 描述
upper 以大写方式输出
addslashes 单引号加上转义号
date 格式化日期
default_if_none 如果值为None, 则使用默认值代替
divisibleby 判断是否可以被数字整除 返回布尔类型
dictsortreversed 按某字段倒序排序,变量必须是dictionary
escape 按HTML转义,比如将”<”转换为”&lt”
first 返回列表的第1个元素,变量必须是一个列表
length 返回列表中元素的个数或字符串长度
linebreaksbr <br/>标签代替换行符
linenumbers 为变量中的每一行加上行号
lower 字符串变小写
length_is 检查列表,字符串长度是否符合指定的值
join 用指定分隔符连接列表
make_list 将字符串转换为列表
pluralize 根据数字确定是否输出英文复数符号
random 返回列表的随机一项
removetags 删除字符串中指定的HTML标记
rjust 输出指定长度的字符串,变量右对齐
stringformat 字符串格式化,语法同python
time 返回日期的时间部分
timesince 以“到现在为止过了多长时间”显示时间变量 结果可能为 45days, 3 hours
timeuntil 以“从现在开始到时间变量”还有多长时间显示时间变量
title 每个单词首字母大写
urlencode 将字符串中的特殊字符转换为url兼容表达方式
urlize 将变量字符串中的url由纯文本变为链接
wordcount 返回变量字符串中的单词数
◇◆◇◆◇
-------------本文结束感谢您的阅读-------------