您的位置:首页 > 编程语言 > Go语言

django学习笔记(二)模板

2016-01-28 21:14 597 查看
1.当模板中的变量名遇到点时,以下面的顺序查找(短路逻辑):

(1)字典类型查找:

>>> 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)
u'Sally is 43 years old.'


(2)对象的属性查找

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


(3)对象的方法查找

例如,每个 Python 字符串都有 upper() 和 isdigit() 方法,你在模板中可以使用同样的句点语法来调用它们:

>>> from django.template import Template, Context
>>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}')
>>> t.render(Context({'var': 'hello'}))
u'hello -- HELLO -- False'
>>> t.render(Context({'var': '123'}))
u'123 -- 123 -- True'


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

(4)列表类型索引查找

>>> from django.template import Template, Context
>>> t = Template('Item 2 is {{ items.2 }}.')
>>> c = Context({'items': ['apples', 'bananas', 'carrots']})
>>> t.render(c)
u'Item 2 is carrots.'


注意:不允许使用负数列表索引。 像 {{ items.-1 }} 这样的模板变量将会引发`` TemplateSyntaxError``。

2.句点查找可以多级深度嵌套。 例如 {{person.name.upper}} 会转换成字典类型查找(person['name'] ) 然后是方法调用( upper() )。

3.默认情况下,如果一个变量不存在,模板系统会把它展示为空字符串,不做任何事情来表示失败。

4.{%if%}标签小结

(1)有{%if%}必须有{%endif%},可以有{%else%},没有{%elif%}这个标签。

(2){% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not )。但是{% if %} 标签不允许在同一个标签中同时使用 and 和 or ,因为逻辑上可能模糊的(模板系统不支持在标签里面用圆括号来组合比较操作)

5.{%for%}标签小结

(1)用法示例

<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>


可以给标签增加一个 reversed 关键字使得该列表被反向迭代

{% for athlete in athlete_list reversed %}
...
{% endfor %}


(2){%empty%}分句:定义在列表为空列表时的输出内容。

{% for athlete in athlete_list %}
<p>{{ athlete.name }}</p>
{% empty %}
<p>There are no athletes. Only computer programmers.</p>
{% endfor %}
{#等价于以下一段代码#}
{% if athlete_list %}
{% for athlete in athlete_list %}
<p>{{ athlete.name }}</p>
{% endfor %}
{% else %}
<p>There are no athletes. Only computer programmers.</p>
{% endif %}


(3)不支持break和continue操作。

(4)在每个`` {% for %}``循环里有一个称为`` forloop`` 的模板变量。这个变量有一些提示循环进度信息的属性。

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

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

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

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

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


forloop.first 是一个布尔值,如果该迭代是第一次执行,那么它被置为" " 在下面的情形中这个变量是很有用的:

{% for object in objects %}
{% if forloop.first %}<li class="first">{% else %}<li>{% endif %}
{{ object }}
</li>
{% endfor %}


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

{% for p in places %}{{ p }}{% if not forloop.last %}, {% endif %}{% endfor %}
{#在每两个p之间加上逗号#}


forloop.parentloop 是一个指向当前循环的上一级循环的 forloop 对象的引用(在嵌套循环的情况下)。

{% for country in countries %}
<table>
{% for city in country.city_list %}
<tr>
<td>Country #{{ forloop.parentloop.counter }}</td>
<td>City #{{ forloop.counter }}</td>
<td>{{ city }}</td>
</tr>
{% endfor %}
</table>
{% endfor %}


6.{%ifequal%}和{%ifnotequal%}标签小结

{% ifequal section 'sitenews' %}
<h1>Site News</h1>
{% else %}{#else为可选标签#}
<h1>No News Here</h1>
{% endifequal %}


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

7.注释有两种:

{#something#}类型的注释是单行的,不能换行,否则输出结果和模板本身是完全一样的(也就是说,注释标签并没有被解析为注释)。

如果要实现多行注释,可以使用{%comment%}{%endcomment%}模板标签。

8.模板过滤器是在变量被显示前修改它的值的一个简单方法。 使用管道字符。

{{ name|lower }}
{{ my_list|first|upper }}


有些过滤器有参数。 过滤器的参数跟随冒号之后并且总是以双引号包含。 例如:

{{ bio|truncatewords:"30" }}

这个将显示变量 bio 的前30个词。

9.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: