模板传递参数
变量需要通过视图函数渲染,视图函数在使用 render 或者 render_to_string 的时候可以传递一个 context 的参数,这个参数是一个字典类型。以后在模板中的变量就从这个字典中读取值的
front/views.py
from django.shortcuts import render
class Person(object):
def __init__(self, username):
self.username = username
def index(request):
p = Person("name")
context = {
"person": p
}
return render(request, "index.html", context=context)
# 在index.html模板文件中可以通过{{ person.username }}获取对象的username属性值
注意:不能通过中括号的形式访问字典和列表中的值,比如dict[‘key’]和list[1]是不支持的!
模板中的变量同样也支持 点(.) 的形式。在出现了点的情况,比如person.username ,模板是按照以下方式进行解析的:
- 如果 person 是一个字典,那么就会查找这个字典的 username 这个 key 对应的值。
- 如果 person 是一个对象,那么就会查找这个对象的 username 属性,或者是 username 这个方法。
- 如果出现的是 person.0 ,会判断 persons 是否是一个列表或者元组或者任意的可以通过下标访问的对象,如果是的话就取这个列表的第1个值。如果不是就获取到的是一个空的字符串。
在for循环中,有一些自带的变量可供使用:
- forloop.counter:当前循环的下标,以1作为起始。如果在后面加个0,就以0作为起始
- forloop.revcounter:循环的反向下标,以1作为最后一个下标值。后面加0,以0作为最后一个下标
- fouloop.first:是否是第一次遍历
- forloop.last:是否是最后一次遍历
for…in…标签
{% for hero in heros reversed %} # 后面加reversed表示反向遍历
<li>{{ i }}</li>
{% endfor %}
遍历字典的时候,可以使用keys, values, items方法输出字典的键值等
{% for key, value in user.items %}
<li>{{ key }}: {{ value }}</li>
{% endfor %}
for…in…empty,如果遍历的对象没有可迭代的元素的话,就会执行empty中的内容,意思就是遍历对象必须为空
{% for comment in comments %}
{{ comment }}
{% empty %}
没有任何评论
{% endfor %}
with标签的使用,可以把一个复杂的变量缓存到一个临时变量上
- 在with语句中定义的变量,只能在{%with%}{%endwith%}中使用,不能在外面使用
- 定义变量的时候,不能再等号两边留有空格,比如{%with name = person.1 %}是错误的
{% with name=person.1 %}
{{ name }}
{% endwith %}
下面这种写法也是正确的
{% with person.1 as name %}
{{ name }}
{% endwith %}