Django(夹层)网址捕捉一切

Django (mezzanine) urls catching everything

我正在 django 项目的管理中编写一些自定义视图,应该很简单。我有一个 "events" 页面,我想创建一个 "event" 页面(与 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/ 作品 但是.../admin/my_cms/events/xxxxxx 只显示相同的事件页面,而不是详细视图

如果我将 url 模式更改为 "events" 以外的任何模式,例如:

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

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

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

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

为了说明,r'^my_cms/events' 将匹配任何以 'my_cms/events' 开头的 URL,例如:

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

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

要修复,请在 URL 正则表达式的末尾添加一个 $ 符号,如下所示:

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