gpt4 book ai didi

Django URL 命名空间 - 模板必须知道它的命名空间?

转载 作者:行者123 更新时间:2023-12-04 02:01:46 25 4
gpt4 key购买 nike

我一直在修补(我的第一个)Django 项目,该项目从 Django 1.6 开始,最近才转移到 Django 1.8。我也一直在研究 Django 模式和最佳实践,学习我应该如何构建它:-)

我的项目有几个子应用程序和一个典型的主 urls.py,其行如下:

 (r'', include('noc.apps.frontpage.urls')),

在每个应用程序中,我都用应用程序名称作为所有 URL 名称的前缀,例如frontpage_edit_page 和使用 {% url %}贯穿整个模板以在 View 之间进行引用。

然后我阅读了 URL 命名空间,并认为我可以去丑化我的 URL 名称。正如我第一次解释的那样,如果我向主 urls.py 中的每个 include() 添加一个命名空间,一切都会像以前一样运行,因为所引用的 URL 名称都将由“本地”应用程序解析。但它似乎不是这样工作的。

在主 urls.py 中使用这个:
(r'', include('noc.apps.frontpage.urls', namespace='frontpage', app_name='frontpage')),

这在应用程序 urls.py 中:
 url(r'^frontpage/edit/(?P<slug>[A-Za-z0-9]+)$', views.edit_page, name='front_page_edit_page'),

{% url 'front_page_edit_page' slug=page.slug %}在该应用程序内的模板中,我收到了一个 NoReverseMatch 异常,其中尝试了 0 个 URL。

我能找到的所有示例都在讨论使用命名空间作为 URL 前缀 - frontpage:front_page_edit_page但是 1) 这对 URL 名称上的先前应用程序前缀有何改进?和 2) 你怎么可能有同一个应用程序的两个实例,这应该是一个好处......所以我假设这是用于应用程序之间的链接,而不是应用程序内的链接。

那么我错过了什么?我是否也需要在 View 函数中嵌入 app_name 或命名空间?确实,如果我在所有 URL 名称前加上命名空间,即使在应用程序中,我也会得到一个呈现的页面,但这似乎违背了这一点。

最佳答案

您打算这样做的方式确实是将命名空间添加到 URL 标记;

{% url 'frontpage:edit_page' slug='SLUG' %}

但是像这样构建您的主项目 URls 文件会是更好的做法;
urlpatterns = patterns(
'',
url(r'^admin/', include(admin.site.urls)), # NOQA
url(r'frontpage', include('noc.apps.frontpage.urls', namespace='frontpage', app_name='frontpage')),

这样你就可以在主 URLs 文件中指定每个应用程序的路径,避免重复;
urlpatterns = patterns(
'noc.apps.frontpage.views',
url(r'^edit/(?P<slug>[A-Za-z0-9]+)$', 'edit_page', name='edit_page'),

有了这个你可以介绍一个 RESTful所有应用程序的 URL 结构,因此您最终会得到以下内容:
urlpatterns = patterns(
'',
url(r'^admin/', include(admin.site.urls)), # NOQA
url(r'frontpage/', include('noc.apps.frontpage.urls', namespace='frontpage', app_name='frontpage')),
url(r'contact/', include('noc.apps.contact.urls', namespace='contact', app_name='contact')),
url(r'myapp/', include('noc.apps.myapp.urls', namespace='myapp', app_name='myapp')),

你所有的应用程序都可以遵循类似的结构;
urlpatterns = patterns(
'noc.apps.contact.views',
url(r'^$', 'index', name='index'),
url(r'^add/$', 'add', name='add'),
url(r'^edit/(?P<slug>[A-Za-z0-9]+)$', 'edit', name='edit'),

urlpatterns = patterns(
'noc.apps.myapp.views',
url(r'^$', 'index', name='index'),
url(r'^add/$', 'add', name='add'),
url(r'^edit/(?P<slug>[A-Za-z0-9]+)$', 'edit', name='edit'),
frontpage 的多个实例可以使用顶级命名空间来实现;
urlpatterns = patterns(
'',
url(r'^admin/', include(admin.site.urls)), # NOQA
url(r'frontpage/', include('noc.apps.frontpage.urls', namespace='frontpage1', app_name='frontpage')),
url(r'frontpage/', include('noc.apps.frontpage.urls', namespace='frontpage2', app_name='frontpage')),

这样你应该能够以顶级实例命名空间为目标,然后是像这样的 app 命名空间;
{% url 'frontpage1:frontpage:edit_page' slug='SLUG' %}
{% url 'frontpage2:frontpage:edit_page' slug='SLUG' %}

但是如果你想让你的模板链接更通用,我相信你可以省略顶级命名空间,django 将解析为你必须添加到请求对象的当前应用程序。这个在 Reversing Namespaced URLs末尾有详细说明

关于Django URL 命名空间 - 模板必须知道它的命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30494000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com