正则表达式匹配 2 个路由的 Django NoReverseMatch 异常

Posted

技术标签:

【中文标题】正则表达式匹配 2 个路由的 Django NoReverseMatch 异常【英文标题】:Django NoReverseMatch Exception for regular expression matching 2 routes 【发布时间】:2016-03-30 13:38:38 【问题描述】:
url(r'^v1/(statistics|analytics)/stats_bar$', views.stats_bar, name='stats_bar')

reverse('stats_bar')

抛出没有找到带有参数“()”和关键字参数“”的“stats_bar”。尝试了 1 种模式:['v1/(statistics|analytics)/stats_bar$']

有什么方法可以操纵 Django 尝试的模式或其他简单的方法来处理这个问题?

Django==1.6.9

【问题讨论】:

【参考方案1】:

https://docs.djangoproject.com/en/stable/ref/urlresolvers/#reverse

查看关于 args 的部分。

【讨论】:

【参考方案2】:

我认为 django 将 (statics|analytics) 解释为变量的模式。我建议如下:

    为同一个视图定义 2 个不同的 url:

    url(r'^v1/statistics/stats_bar$', views.stats_bar, name='stats_bar_statistics')
    url(r'^v1/analytics/stats_bar$', views.stats_bar, name='stats_bar_analytics')
    
    reverse('status_bar_statistics') # usage
    

    并在视图内部测试使用了哪个 url:

    if 'analytics' in request.path:
        # do something
    elif 'statistics' in request.path:
        # do otherthing
    

    你定义一个带有参数的url:

    url(r'^v1/ (?P<type>(statistics|analytics))/stats_bar$', views.stats_bar, name='stats_bar')
    
    reverse('status_bar', kwargs='type': 'statistics') # usage
    

【讨论】:

@knbk 你测试了吗?我已经对此进行了测试,它对我很有用。 对不起,我看错了django中的相关代码。不支持它,除非在捕获组中,在这种情况下,它只是被适当的参数完全替换。这意味着您的解决方案是完全有效的。

以上是关于正则表达式匹配 2 个路由的 Django NoReverseMatch 异常的主要内容,如果未能解决你的问题,请参考以下文章

61.Django04——Django路由层

61.Django04——Django路由层

Django url (路由)

django——路由

Flask自定义转换器,实现路由匹配正则表达式参数

Django 2.0 的路由如何实现正则表达式