Django学习笔记10-URL的名称空间
2017-08-09 11:37
741 查看
移除模板中硬编码的 URLS
在polls/index.html模板中,我们链接到poll的链接是硬编码成这样子的<li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li>
问题出在硬编码,紧耦合使得在大量的模板中修改URLS将是一件让人抓狂的事情。 不过,既然在 polls.urls模块中的url()函数中定义了命名参数,那么就可以在 模板中使用模板标记来移除特定的URL 路径依赖:
<li><a href="{% url 'detail' poll.id %}">{{ poll.question }}</a> </li>
注意
如果 {% url 'detail' poll.id %} (含引号) 不能运行,但是{% url detail poll.id %} (不含引号) 却能运行,那么意味着你使用的Djang 低于 < 1.5 版。这样的话,你需要在模板文件的顶部添加如下的声明:{% load url from future %}
其原理就是在 polls.urls 模块中寻找指定名称的URL 定义。 命名为 'detail' 的URL 就如下所示那样定义的一样:
# 'name' 的值由 {% url %} 模板标记来引用 url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'),
如果你想将polls的detail视图的URL改成其他样子,例如polls/specifics/12/ 这样子,那就不需要在模板(或者模板集)中修改而只要在 polls/urls.py 修改就行了:
# 新增 'specifics' url(r'^specifics/(?P<poll_id>\d+)/$', views.detail, name='detail '),
URL名称空间
本项目只有一个应用:polls 。在实际的 Django 项目中,可能有多个应用。Django 将如何区分它们的URL 名称的呢? 比如, polls应用有一个名称为 detail 视图,而同一个项目中的blog应该也有一个名称为detail的视图。 使用模板标记创建应用的url时Django 是如何知道选择哪个detail呢? 为了解决上述名称冲突问题,在你的 root URLconf 配置中添加命名空间。在 myweb/urls.py文件 (项目的urls.py ,不是应用的) 中,修改为包含命名空间的定义:
from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', url(r'^polls/', include('polls.urls', namespace="polls")), url(r'^admin/', include(admin.site.urls)), )
现在将 polls/index.html 模板中原来的 detail 视图中的:
<li><a href="{% url 'detail' poll.id %}">{{ poll.question }}</a> </li>
修改为包含命名空间的 detail 视图:
<li><a href="{% url 'polls:detail' poll.id %}">{{ poll.question }}</a></li>
这样就Django就可以准确找到对应的detail视图
相关文章推荐
- The Definitive Guide To Django 2 学习笔记(一) Views and UrL confsRL
- The Definitive Guide To Django 2 学习笔记(三) URLconfs 和松耦合
- django_book学习笔记2-视图和URL配置
- Django框架学习笔记(8.对应路由名称和路由分发)
- Django框架学习笔记(10.基于ORM实现简单的用户登录)
- C++学习笔记(第9章->内存模型和名称空间)
- 学习笔记:WPF学习之X名称空间详解
- C++学习笔记六——内存模型和名称空间、关键字
- 【day 10】python编程:从入门到实践学习笔记- 基于Django框架的Web开发-Django入门(一)
- 学习笔记之内存模型和名称空间(二)
- 【django 学习笔记】02-视图和URL配置
- Django url反向解析与路由分发名称空间
- WPF快速学习笔记三 x名称空间
- django学习笔记(一)视图和url配置
- C++ Primer plus 学习笔记之第九章内存模型和名称空间(1)
- C++学习笔记二之4种访问名称空间std的方法
- oracle 11g 学习笔记 10_31_管理表空间和数据文件
- 学习笔记(二)C#获取当前正在执行的代码的命名空间、类、方法的名称
- WPF快速学习笔记三 x名称空间
- oracle 11g 学习笔记 10_31_管理表空间和数据文件