好的,要明确我已经搜索过并阅读,按照官方文档,尝试了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模式,但是错误实际上并不是很清楚实际上是什么错误。
答案 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
替换为内部组而不是外部组。