我在SO和其他地方已经探究过NoReverseMatch
个问题,但无济于事。
我有一个查看方法clean
,位于redirect
中:
def clean(request, aid):
if request.method == 'POST':
return redirect(enrich,
permanent=True,
aid=account.id)
else:
return render(request, 'clean.html')
还有一个名为enrich
的视图方法:
def enrich(request, aid):
return HttpResponse('this be the enrich page')
它在path
中有一个urls.py
:
path('<aid>/enrich/', views.enrich, name='enrich'),
但是,当用redirect
方法调用clean
时,Python告诉了我:
NoReverseMatch at /app2/<aid>/clean/
Reverse for 'app2.views.enrich' not found. 'app2.views.enrich' is not a valid view function or pattern name.
这让我感到困惑,因为app2.views.enrich
确实存在。我是什么做的?该路径存在并且可以正确运行(如果我访问/app2/<aid>/add/
,我会受到适当的HTTP响应的欢迎),但是在 redirect 上,它实际上似乎没有任何作用,并且也没有任何作用其他视图。
某些上下文:
免责声明:该应用实际上未称为“ app2”,只是一个占位符。
答案 0 :(得分:1)
此程序中的错误是redirect(enrich, ...)
,第一个重定向参数不能是视图函数或视图类。
从https://docs.djangoproject.com/en/2.1/_modules/django/shortcuts/#redirect引用:
参数可以是:
模型:将调用模型的
get_absolute_url()
函数。将使用视图名称,可能带有参数:
urls.reverse()
反向解析名称。URL,它将原样用作重定向位置。
Reverse for 'app2.views.enrich' not found
的错误消息是因为它打印了视图函数的限定名称。
您应使用str 'enrich'
作为redirect()
中的第一个参数。
答案 1 :(得分:0)
在多个应用程序的上下文中,必须在重定向中指定应用程序名称空间。
return redirect('app2:enrich', ...