2015-04-07 2 views
1

Как видно из 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 после запроса поста?

Спасибо.

+0

Вы можете использовать перенаправление с переменными GET или использовать структуру сообщений –

ответ

2

Это никоим образом не является ограничением Django, и вы, кажется, не продумали, как это будет работать.

Переадресация - это простой ответ HTTP, который сообщает вашему браузеру идти и запрашивать другую страницу. Как Django, или любая инфраструктура, передает контекст через эту перенаправление? Куда это пойдет? И получающий URL-адрес будет иметь свое собственное представление, которое создало бы свой собственный контекст - что бы он сделал с контекстом «перенаправления»? Как это знать?

Но в любом случае я не понимаю, почему вы хотите перенаправить назад на ту же страницу на ошибке. Просто повторите его. Принцип redirect-after-POST предназначен для успешных сообщений, а не для неудачных.