我正在尝试配置我的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仅在省略第一个URL时才匹配第二个URL?

最佳答案

/results/3与您的url模式匹配,因为您的正则表达式没有字符串结尾$。请注意以下两者之间的区别:

>>> 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')

关于python - Django:网址分配器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22338339/

10-14 15:13