【问题标题】:Django: url dispatcherDjango:网址调度程序
【发布时间】:2014-04-15 19:25:37
【问题描述】:

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

【问题讨论】:

    标签: python django


    【解决方案1】:

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

    【讨论】:

    • 谢谢,效果很好!但是,我仍然不确定为什么 /results/3 匹配 r'^results/' ...?
    • @Karnivaurus 我在上面编辑了我的答案来回答你的问题。
    • @Karnivaurus 很高兴为您提供帮助!
    猜你喜欢
    • 2018-06-11
    • 2013-03-30
    • 2012-12-18
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    相关资源
    最近更新 更多