Skip to main content
 首页 » 编程设计

python之Django:网址调度程序

2024年08月27日28qlqwjy

我正在尝试配置我的 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')