django-cms url with Slug at Root

时间:2013-09-24 08:41:55

标签: django django-urls django-cms

在我的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]+)/$, ...)这可能不是最佳解决方案。

1 个答案:

答案 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模式匹配时进行细粒度控制,但模式仍可能发生冲突。这将违反松耦合原则。它会咬你。

结论:将应用包含在唯一的网址中。确保应用中的每个模式都是唯一的。广泛的匹配模式应该在更重要的模式之后出现。