我在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),它会显示事件页面吗?
乔
答案 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"),