为什么这个django url正则表达式会吃掉它下面的所有网址?

时间:2014-12-20 23:44:45

标签: python regex django django-urls

我无法让Django点击任何与其他网址共享公共根目录的网址。这必须是我的正则表达式问题,但我staring at the docs,据我所知,事情格式正确。

我的urls.py看起来像这样:

...
url(r'(?P<pagename>\w)/$', views.show_page, name='page'),
url(r'(?P<pagename>\w)/info/$', views.show_info, name='info'),

问题是列表中的第一个正则表达式会占用它后面的所有正则表达式。所以,例如,如果我导航到:

mysite.com/page/some-page-name/ 

匹配的第一个模式是r'(?P<pagename>\w)/$'。但是,如果我尝试导航到:

mysite.com/page/some-page-name/info/ 

它仍会选择第一个正则表达式,然后触发show_page视图,而不是show_info视图。

如果我评论出第一个正则表达式。

...
# url(r'(?P<pagename>\w)/$', views.show_page, name='page'),
url(r'(?P<pagename>\w)/info/$', views.show_info, name='info'),

然后我可以点击page-name/info/网址没问题。同样,如果我重新排列网址顺序,我可以点击正确的页面。但是,从Django的例子中,我应该能够根据特异性将它们堆叠起来。例如

url(r'^articles/(\d{4})/$', views.year_archive),
url(r'^articles/(\d{4})/(\d{2})/$', views.month_archive),
url(r'^articles/(\d{4})/(\d{2})/(\d+)/$', views.article_detail),

我做错了什么?


根据建议:

我在网址模式中添加了^字符,但现在两个都没有用!

urlpatterns = patterns('',
    url(r'^(?P<pagename>\w)/$', views.show_page, name='page'),
    url(r'^(?P<pagename>\w)/storecomment/$', views.show_info, name='info'),
)

为了完整性,这是项目的urls.py

urlpatterns = patterns('',
    url(r'^$', 'main.views.index'),
    url(r'^page/', include('main.urls')),
    url(r'^admin/', include(admin.site.urls)),
)

我遇到的错误:

mysite.com/page/some-page-name/
mysite.com/page/some-page-name/info/


Django tried these URL patterns, in this order:
^__debug__/
^$
^page/^(?P<pagename>\w)/$ [name='page']
^article/^(?P<pagename>\w)/info/$ [name='info']
^admin/

1 个答案:

答案 0 :(得分:2)

您还需要检查字符串的开头(^):

url(r'^(?P<pagename>\w)/$', views.show_page, name='page'),
url(r'^(?P<pagename>\w)/info/$', views.show_info, name='info'),

没有它(?P<pagename>\w)/$正则表达式会捕获some-page-name/some-page-name/info/个网址,因为它正在检查单个字母数字字符,斜杠和字符串的结尾:

>>> re.search(r'(?P<pagename>\w)/$', 'p/').group(1)
'p'
>>> re.search(r'(?P<pagename>\w)/$', 'p/info/').group(1)
'o'