使用现有的查看方法在`redirect()`处进行NoReverseMatch

时间:2018-11-18 23:17:36

标签: python django python-3.x

我在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 上,它实际上似乎没有任何作用,并且也没有任何作用其他视图。

某些上下文:

  • 此Django项目中有3个应用程序
  • 所有这些应用程序均已被证明具有其功能,并具有其视图
  • 版本为Django 2.1和Python 3.7.1

免责声明:该应用实际上未称为“ app2”,只是一个占位符。

2 个答案:

答案 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', ...