Django之第一个app<15>

来源:互联网 发布:2am 2pm 知乎 编辑:程序博客网 时间:2024/05/11 08:40

使用模版系统

回到我们的投票应用的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, urlfrom django.contrib import adminurlpatterns = [    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>
0 0