使用模版系统
回到我们的投票应用的detail()
视图,给context一个question
这个变量,这里是polls/detail.html
模版的内容:
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>
模版系统使用点语法来获取变量属性,比如{{ question.question_text }}
,Django对对象question
做一个字典查询。Django会进行一个属性查询,在本例子中,是可以查询到的,如果属性查询失败的话,它不会尝试列表查询。
方法调用发生在{% for %}
循环中:question.choice_set.all
被翻译成python代码:question.choice_set.all()
,它会返回一个Choice
对象的遍历,适合在{% for %}
使用。
删除模版中硬编码的URLs
记住,当我们在polls/index.html
模版中写一个question的链接时,链接几乎是硬编码式的:
<li><a href="/polls/{{ question.id }}/">{{question.question_text }}</a></li>
这种硬编码、紧凑的代码格式的问题是改变拥有众多模版的工程中的URLs是非常具有挑战性的。但是,因为你在polls.urls
模块中的url()
函数中定义了name
参数,你可以通过使用{% url %}
这个模版标签来移除对特定URL路径的依赖。
<li><a href="{% url 'detail' question.id %}"> {{ question.question_text }}</a></li>
为URL名字起命名空间
这个指导教程只有一个应用,即polls
。在真正的Django工程中,可能有五个、十个、二十个甚至更多的应用。那么Django是如何区分这些URL名字呢?例如,polls
应用有一个detail
视图,并且polls所在工程中有一个blog
应用。当使用{% url %}
模版标签时,Django如何知道该为一个URL创建那个应用视图呢?答案是为你的根URLconf
添加一个命名空间。在mysite/urls.py
文件中,修改下代码,添加命名空间:
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^polls/', include('polls.urls', namespace="polls")),
url(r'^admin/', include(admin.site.urls)),
]
现在,修改你的polls/index.html
模版,在polls/templates/polls/index.html
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>