我正在尝试配置我的Django url调度程序。我希望/results
呈现我的results
模板,并/results/3
呈现我的user_results
模板,例如3
。如果我使用以下代码:
url(r'^results/', views.results, name='results'),
url(r'^results/(\d+)/$', views.user_results, name='user_results')
然后/results
和/results/3
加载呈现results
模板。但是,如果我注释掉第一行,则/results/3
会按预期呈现user_results
模板。
为什么/results/3
仅在省略第一个网址时匹配第二个网址?
答案 0 :(得分:3)
/results/3
与您的网址格式匹配,因为您的正则表达式没有字符串结尾$
。请注意以下内容之间的区别:
>>> import re
>>> re.match(r'^results/', 'results/3') # no end of string $
<_sre.SRE_Match object at 0x02BFD3D8>
>>> re.match(r'^results/$', 'results/3')
最容易(也可能是最好)的事情是在你的第一个url模式中添加一个字符串结尾$
:
url(r'^results/$', views.results, name='results'),
url(r'^results/(\d+)/$', views.user_results, name='user_results')
否则,您可以撤消您的网址格式。一旦找到匹配的url模式,调度程序将停止搜索url模式并立即调度。试试这个:
url(r'^results/(\d+)/$', views.user_results, name='user_results'), # will dispatch here and stop searching url patterns if a digit occurs after results
url(r'^results/', views.results, name='results')