3.11 使用模板系统
前面的detail.html模板过于简单,现实中Django的模板系统非常强大,可以制作丰富多彩的网页效果。将以下代码复制到模板文件detail.html中:
上面代码中的双大括号形式({{ }})是Django模板语言中的属性访问语法,采用英文句点的方式访问变量的属性,如示例中的代码{{ question.question_text }},其中question是视图通过字典形式传递给模板的变量,通过“.”访问question的属性。
模板中{% %}形式的代码是Django模板语言的函数语法,上例中{% for choice in question.choice_set.all %}是一个for循环,循环对象是question.choice_set.all,该对象等价于Python语法中的question.choice_set.all(),返回一个可迭代的数组。Django模板函数需要有结束标记,本例中{% for %}循环的结束标记是{% endfor %}。
3.11.1 模板中的超链接
在前面polls/index.html模板中,使用硬编码的形式编写HTML超链接:
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
当项目中存在很多模板并且多个模板都使用同一个URL的时候,如果需要修改URL,那么这种书写方式会给开发人员带来很大的工作量。此时可以通过对URL命名的方式解决这类问题,之前介绍URL时讲到了URL的命名,本例中的URL如下:
path('<int:question_id>/', views.detail, name='detail'),
使用URL重新修改模板如下:
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
其中,{% url %}是Django的模板标签,用于定义URL。该标签将会在polls/urls模块中查找名为“detail”的URL,question.id作为参数传递给URL,如果需要传递多个参数时,只要在question.id后面紧跟一个空格然后继续添加参数即可。
通过{% url %}模板标签可以快速修改模板中的URL,极大地提高工作效率,以保证代码安全。例如在这个URL中增加一个节点,如改成polls/specifics/12/,此时只要修改urls.py中的定义即可:
path('specifics/<int:question_id>/', views.detail, name='detail'),
3.11.2 为超链接添加命名空间
命名空间可以有效地隔离变量,防止出现名称相同的变量之间调用混乱的问题。Django中可以为URL定义命名空间。试想一下,在真实项目中往往会存在很多应用程序,而不同应用程序之间可能存在同名的视图,如多个应用程序中都存在detail视图,那么在{% url %}标签中如何确定调用哪一个应用程序中的URL呢?此时可以通过为URL添加命名空间的方式解决以上问题。
打开polls/urls.py文件,在其中添加app_name变量来设置URLconf的命名空间,修改后的代码如下:
接下来修改polls/index.html模板中的URL,为detail视图添加命名空间:
此时单击index页面中的超链接仍能正常显示。