Невозможно выполнить простое перенаправление после запроса POST в Django (используя HttpResponseRedirect) - PullRequest
1 голос
/ 16 мая 2019

Я пытаюсь вернуть HTTP-ответ после запроса POST в Django, похоже, он не работает.Я проиллюстрировал это ниже, используя HttpResponseRedirect.

При выполнении приведенного ниже кода я вижу сообщение "привет", но оно не перенаправляется.если я переместу строку return HttpResponseRedirect ('/ account /') 'вниз, то при загрузке страницы она будет перенаправлена, поэтому строка работает иначе.

if request.POST:
    print('hello')
    return HttpResponseRedirect('/thank-you/')
else:
    return render(request, 'account.html')

Ответы [ 2 ]

3 голосов
/ 16 мая 2019

Вы проверяете метод, сравнивая request.method [Django-doc] с нужным вам методом, поэтому здесь request.method == 'POST'.request.POST [Django-doc] - это QueryDict, который содержит параметры в запросе POST, но не каждый запрос POST имеет параметры POST.Если такой запрос POST не имеет параметров, то if request.POST завершится неудачей.

Таким образом, вы можете использовать:

if <b>request.method == 'POST'</b>:
    print('hello')
    return HttpResponseRedirect('/thank-you/')
else:
    return render(request, 'account.html')

При этом, возможно, вы захотите использовать redirect(..) [Джанго-док] вместо.redirect(..) - это ярлык, в котором вы можете указать название представления.Если позже вы измените путь к представлению, это все равно будет работать, поэтому:

from django.shortcuts import <b>redirect</b>

if request.method == 'POST':
    print('hello')
    return <b>redirect('name-of-view')</b>
else:
    return render(request, 'account.html')

* redirect(..) выполнит «обратный поиск» и превратит созданный им путь в HttpResponseRedirect(..)объект.Таким образом, по сути это точно то же самое, но этот метод более «стабилен», поскольку, как уже говорилось, если вы измените свой urls.py, обратный поиск все равно будет успешным.

1 голос
/ 16 мая 2019
if request.method == 'POST':
    print('hello')
    return HttpResponseRedirect('/thank-you/')
else:
    return render(request, 'account.html')

ну, вам нужно проверить метод

from django.shortcuts import redirect

if request.method == 'POST':
        print('hello')
        return redirect('/thank-you/')
    else:
        return render(request, 'account.html')

, благодаря @Willem Van Onsem для указания POST должна быть строка, а не CONSTANT

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