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 模式分布在文件中的主要内容,如果未能解决你的问题,请参考以下文章

Django 笔记 05 urls.py详解

Django 路由 urls.py

Django之路由系统

Django 路由控制

Django:视图如何从 url 获取多个值?

url.py文件详解