Django(夹层)网址捕捉一切

时间:2017-04-14 12:14:48

标签: python django mezzanine

我在django项目的管理员中写了一些自定义视图,应该很简单。我有一个“事件”页面,我想创建一个“事件”页面(与django民意调查教程完全相同,但在管理员中,事件页面与详细视图相同。) 不,我不能像使用外键等那样正常使用内置功能,需要从头开始构建。

urls.py:

admin.autodiscover()
def get_admin_urls(urls):
    def get_urls():
        my_urls =  [
           url(r'^my_cms/events', views.events, name="events"),
           url(r'^my_cms/events/(?P<event_id>[0-9]+)/$', views.detail, name='detail'),
        ]
        return my_urls + urls
    return get_urls
admin_urls = get_admin_urls(admin.site.get_urls())
admin.site.get_urls = admin_urls

urlpatterns = i18n_patterns("",
    ("^admin/", include(admin.site.urls)),
)

所以.. 访问... / admin / my_cms / events / works 但是... / admin / my_cms / events / xxxxxx只显示相同的事件页面,而不是详细视图

如果我将网址格式更改为“事件”以外的任何内容,例如:

url(r'^my_cms/events', views.events, name="events"),
url(r'^my_cms/[anything]/(?P<event_id>[0-9]+)/$', 

然后它会正确显示事件视图......

所以我的问题是为什么第一个网址会捕获所有内容?我可以放任何东西(... / admin / my_cms / events / anythingilike),它会显示事件页面吗?

1 个答案:

答案 0 :(得分:2)

因为r'^my_cms/events'最后没有$。这意味着,只检查此URL的开头,而不是结尾。

为了说明,r'^my_cms/events'将匹配以'my_cms/events'开头的所有网址,例如:

'my_cms/events'
'my_cms/events/xxxxxx'
'my_cms/eventsxxxxxx'

因此,即使您向'my_cms/events/xxxxxx'处的详细信息视图发出请求,也会匹配事件页面网址。一旦Django找到匹配项,它就不会检查更多的URL并调用相关视图。

要修复此问题,请在您的网址regexp末尾添加$标记,如下所示:

url(r'^my_cms/events/$', views.events, name="events"),