我一直在摆弄我的第一个Django项目,该项目最初使用的是Django 1.6版本,最近刚刚升级到了Django 1.8。同时,我一直在学习《Django Patterns & Best Practices》以了解我应该如何更好地组织它。
我的项目有几个子应用程序和一个典型的主urls.py文件,其中包含类似以下内容的行:
(r'', include('noc.apps.frontpage.urls')),
在每个应用程序中,我都使用应用程序名称作为URL名称的前缀,例如frontpage_edit_page,并在模板中使用{% url %}
来引用视图之间的链接。
后来我了解到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 异常,没有尝试任何 URL。我能找到的所有示例都是关于在 URL 命名空间前缀中添加前缀的 -
frontpage:front_page_edit_page
,但是 1)这如何改善以前的应用程序前缀? 2)你怎么可能有两个相同应用程序的实例,这应该是一个好处... 所以我认为这是用于在应用程序之间链接,而不是在应用程序内部。那么我错过了什么? 我需要在我的视图函数中嵌入 app_name 或命名空间吗? 如果我确实在所有 URL 名称前缀中添加命名空间,甚至在应用程序内部,我会得到一个呈现的页面,但似乎违背了初衷。