在我的url.py中,我有:
urlpatterns += patterns('',
url(r'^tinymce/', include('tinymce.urls')),
url(r'^', include('cms.urls')),
url(r'^journal/', include('zinnia.urls')),
url(r'^comments/', include('django.contrib.comments.urls')),
)
和
urlpatterns += patterns('',
url(r'^(?P<slug>[-\w\d]+)/$', PremiumListingDetailView.as_view(), name='premium_listing'),
)
我希望在http://www.example.com/slug有高级列表的slug的网址来显示DetailView。如果我将高级列表的网址放在django-cms之前,页面会加载,但其余的cms页面将不会显示,例如转到http://www.example.com/about会抛出404.如果我将它放在cms'包含网址之后,转到http://www.example.com/slug将无效。
我应该如何构建urls文件以实现我的需求?现在,我在列表网址前附加了一个代字号:url(r'^~(?P<slug>[-\w\d]+)/$, ...)
这可能不是最佳解决方案。
答案 0 :(得分:1)
针对app x的网址与app y的模式相匹配。视图无法匹配slug并返回404未找到。
模式r'^'
或r'^(?P<slug>[-\w\d]+)/$'
应该是最后的,因为它会抓住任何东西。仅使用两者中的一个,因为它们匹配相同(请参阅cms.urls)。考虑使用slug 注释的PremiumListingDetailView对象。此刻它会劫持评论应用程序。将最大匹配模式放在最后,重要模式将始终优先。
修复模式冲突的简单(以及未来证明)方法是使模式独特:
url(r'^cms/', include('cms.urls')), # Added cms/
现在,如果slug不是 tinymce , cms , journal 或 comments ,它最终会出现在PremiumListingDetailView中。
或者你可以使PremiumListingDetailView模式独一无二(你用波浪号做了这个):
url(r'^list/(?P<slug>[-\w\d]+)/$', # Added list/
PremiumListingDetailView.as_view(),
name='premium_listing'),
url(r'^', include('cms.urls')), # CMS comes after.
但是如果cms在list/something/
有视图怎么办?将无法访问cms视图。该请求将由PremiumListingDetailView处理,并且slug 某些将不存在,从而导致404.
从技术上讲,您可以将PremiumListingDetailView模式放在cms.urls中,您可以对cms或PremiumListingDetailView模式匹配时进行细粒度控制,但模式仍可能发生冲突。这将违反松耦合原则。它会咬你。
结论:将应用包含在唯一的网址中。确保应用中的每个模式都是唯一的。广泛的匹配模式应该在更重要的模式之后出现。