2017-04-14 61 views
0

我在django项目的管理员中编写了一些自定义视图,应该很简单。我有一个“事件”页面,我想创建一个“事件”页面(与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)), 
) 

所以.. 来访... /管理/ my_cms /事件/工程 但是... /管理/ my_cms /事件/ XXXXXX只是显示在同一页面的事件,而不是详细视图

如果我URL模式更改为“事件”如任何其他:

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

然后它会显示该事件视图科尔ectly ...

所以我的问题是为什么第一个URL捕捉所有的东西?我可以把任何东西(... /管理/ my_cms/events/anythingilike),它会显示事件页面?

+0

代替'URL(R '^ my_cms /事件',views.events,名称= “事件”)的'尝试'URL(r'^ my_cms/events/$',views.events,name =“events”)' – xiaoyi

回答

1

因为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',活动页面URL匹配。一旦Django找到匹配项,它就不检查更多的URL并调用相关的视图。

要解决,你的URL的正则表达式的末尾添加$标志,就像这样:

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

谢谢,烦人简单.. :) – joeskru