正则表达式匹配 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 异常的主要内容,如果未能解决你的问题,请参考以下文章