Django网址 - 没有反向匹配

时间:2016-08-27 22:08:25

标签: django python-3.x

好的,要明确我已经搜索过并阅读,按照官方文档,尝试了SOF的多种解决方案,似乎没有任何工作,所以我不得不求助于羞耻。

我只是想以正确的方式生成网址。

root urls.py:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'|/', include('main.urls')),

]

urls.py:

app_name = 'main'
urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^vieworder/(?P<order_id>[0-9]+)/$', views.vieworder, name='vieworder'),
]

模板文件:

<td><a href="{% url 'main:vieworder' order.id %}">View</a></td>

也尝试过:

<td><a href="{% url 'main:vieworder' order_id=order.id %}">View</a></td>

错误:

Reverse for 'vieworder' with arguments '(1,)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['|/vieworder/(?P<order_id>d+)/$']

我不明白为什么这不起作用。我在regex测试器中对vieworder / 1 /测试了正则表达式,它工作正常。 Django甚至在错误中告诉我它尝试了正确的url模式,但是错误实际上并不是很清楚实际上是什么错误。

1 个答案:

答案 0 :(得分:1)

Django无法反转在捕获组之外使用|字符。但是,我非常怀疑你在这里需要它。

Django始终匹配url的第一个斜杠,因此不需要匹配正则表达式中的起始斜杠。添加起始斜杠只会匹配网址开头的第二个斜杠。除非您希望网址路径为example.com//vieworder/1/而不是example.com/vieworder/1/,否则您应该只删除模式中的斜杠。

由于第一个斜杠已经与Django匹配,并且第一个斜杠和vieworder/1/部分之间没有其他任何内容,您可以将包含模式留空:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'', include('main.urls')),
]

这将匹配网址example.com/vieworder/1/,并允许Django反转网址。

至于你的第二个问题:

您需要使用?:

将外部组设为非捕获组
url(r'^vieworder(?:/(?P<order_id>\d+))*/$', views.vieworder, name='vieworder'),

Django将替换最外面的捕获组,在这种情况下应该包含/1而不是1。通过使其成为非捕获组,Django将把参数1替换为内部组而不是外部组。