Как видно из this question и принятого ответа, единственный способ перенаправления с контекстом - сохранить его в сеансе. Почему у Django нет простого метода redirect
, который принимает объект контекста, такой как render
?Почему Django не разрешает перенаправление с контекстом
Например, скажем, у меня есть вид входа, который принимает запросы GET
и POST
. GET
запрос просто отображает форму, в которой пользователь может ввести учетные данные, что вызовет вызов POST
на тот же вид.
def login(request, *args, **kwargs):
if request.method == 'GET':
context = {}
context.update(csrf(request))
return render(request, 'login.html', context=context)
elif request.method == 'POST':
username = request.POST.get('username', '')
password = request.POST.get('password', '')
user = auth.authenticate(username=username, password=password)
if user is not None:
auth.login(request, user)
return redirect('loggedin')
else:
# Redirect with a context object that has 'error':True,
# so that the login template can display error message:
# 'Username/password is incorrect'
redirect('login')
return redirect('invalid')
Пожалуйста, обратите внимание, что после вступления неправильной комбинации имени пользователя/пароля, я хотел бы перенаправить пользователя на той же странице входа с ошибкой набора переменных в контексте, так что шаблон может вытягивать предупреждение ,
Я знаю, возможный ответ будет вызывать render
с пользовательским контексте, чем redirect
, но это не является хорошей практикой всегда использовать redirect
после запроса поста?
Спасибо.
Вы можете использовать перенаправление с переменными GET или использовать структуру сообщений –