1

在我的 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上获得高级列表的 url以显示 DetailView。如果我将高级列表的 url 放在 django-cms 之前,页面会加载,但不会显示其余的 cms 页面,例如转到http://www.example.com/about会抛出 404。如果我把它放在之后cms 的包含 url,去http://www.example.com/slug将不起作用。

我应该如何构建 urls 文件以实现我需要的内容?现在,我在列表 url 前面附加了一个波浪号:url(r'^~(?P<slug>[-\w\d]+)/$, ...)这可能不是最好的解决方案。

4

1 回答 1

1

用于 app x 的 url 与 app y 的模式匹配。视图无法匹配 slug 并返回 404 not found。

模式r'^'orr'^(?P<slug>[-\w\d]+)/$'应该排在最后,因为它会捕捉到任何东西。仅使用两者之一,因为它们匹配相同(请参阅 cms.urls)。考虑一个带有 slug comments的 PremiumListingDetailView 对象。此时它会劫持评论应用程序。将宽匹配模式放在最后,重要的模式将始终优先。

修复模式冲突的简单(且面向未来)的方法是使模式独一无二:

url(r'^cms/', include('cms.urls')), # Added cms/

现在,如果 slug 不是tinymcecmsjournalcomments,它最终会出现在 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 模式,但模式仍然可能发生冲突。这将违反松散耦合原则。它会咬你。

结论:在唯一的 url 中包含应用程序。确保应用程序中的每个模式都是独一无二的。宽匹配模式应该出现在更重要的模式之后。

于 2013-09-24T11:24:22.797 回答