Django:从根目录开始的多个 url 模式分布在文件中
Posted
技术标签:
【中文标题】Django:从根目录开始的多个 url 模式分布在文件中【英文标题】:Django: Multiple url patterns starting at the root spread across files 【发布时间】:2012-07-22 00:25:43 【问题描述】:我想知道是否可以将标准 url 模式分布在多个文件中(在本例中是项目范围的 urls.py
和几个特定于应用程序的 urls.py
)。
想象一下项目urls.py
看起来像这样(得到这个工作):
from django.conf.urls import patterns, include, url
admin.autodiscover()
urlpatterns = patterns('',
url(r'^user/signup/', 'registration.views.signup'),
url(r'^user/confirm/(?P<code>\w20)/', 'registration.views.confirm'),
url(r'^user/profile/(\d+)/', 'profile.views.show'),
url(r'^user/profile/edit/', 'profile.views.edit'),
)
如您所见,我有两个不同的应用程序都想使用 /user/* 的 URL,所以我不能只使用 r'^user/'
和包含。
我的问题是:我可以将以上内容分成两个单独的 urls.py
文件,每个文件都进入各自的应用程序吗?
注意:忽略任何语法错误,因为这是输入
【问题讨论】:
【参考方案1】:当然。 URL 是按顺序处理的,两个包含可以具有相同的前缀 - 如果一个没有成功匹配,则处理将继续进行下一个。
urlpatterns = patterns('',
url(r'^user/', include('registration.urls')),
url(r'^user/', include('profile.urls')),
)
【讨论】:
啊,所以从技术上讲,如果我想添加带有各种前缀的网址(想象一下 user/、profile/ 和 reset/ 在同一个应用程序中),我可以在技术上添加url(r'^$', include('something'))
。
是的,除了没有 $ - 你不希望它包含在内,因为它会终止匹配。
感谢您提示我这应该有效。除非您设置了名称空间,否则它不会。我的解决方法是在一个 urlpatterns 变量中收集所有具有相同前缀的模式,然后使用命名空间包含它。
我们可以为url
设置相同的命名空间吗?像这样:urlpatterns = patterns('', url(r'^user/', include('registration.urls'), namespace="user"), url(r'^user/', include('profile.urls'), namespace="user"), )
【参考方案2】:
另外我建议添加这样的命名空间:
urlpatterns = patterns('',
url(r'^user/', include('registration.urls', namespace="registration")),
url(r'^user/', include('profile.urls', namespace="profile")),
)
【讨论】:
命名空间是干什么用的? @eugene 它使引用 URL 更容易。在此示例中,如果registration
应用程序包含定义为 re_path(r'^register/$', views.register, name='register')
的 URL,则可以在 Python 代码中使用 reverse('registration:register')
或在模板中使用 % url 'registration:register' %
引用它。基本上,您是在为您的 URL 和 URL 组命名,而不是每次都输入整个 URL,并且在其定义发生更改时必须返回并编辑 URL 的每次使用。以上是关于Django:从根目录开始的多个 url 模式分布在文件中的主要内容,如果未能解决你的问题,请参考以下文章