NoReverseMatch в `redirect ()` с существующими методами представления - PullRequest
0 голосов
/ 19 ноября 2018

Я пробирался сквозь кучу NoReverseMatch вопросов здесь, на SO и в других местах, но безрезультатно.

У меня есть метод просмотра, 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 голосов
/ 19 ноября 2018

В контексте нескольких приложений необходимо указать пространство имен приложения в перенаправлении.

return redirect('app2:enrich', ...
0 голосов
/ 19 ноября 2018

В этой программе неверно redirect(enrich, ...), первый аргумент перенаправления не может быть функцией представления или классом представления.

ref из 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...