我无法让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/
答案 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'