2012-04-03 3 views
1

Я создал страницу входа в систему с помощью принудительной регистрации на нескольких страницах. Теперь мне нужно перенаправить обратно на предыдущую страницу после успешного входа в систему.Переадресация назад на предыдущую страницу после входа в систему (Django)

Когда я заставляю логин @login_required(login_url='/login/'). Он включает в себя параметр next в строке запроса.

enter image description here

Я попытался поймать его с redirect_to = request.REQUEST.get('next', '') и отправить его для перенаправления return HttpResponseRedirect(redirect_to) но не работает.

view.py

def login(request): 
    def errorHandle(error): 
     form = LoginForm() 
     return render_to_response('login/login.html', { 
      'error' : error, 
      'form' : form, 
      }) 
    if request.method == 'POST': # If the form has been submitted... 
     form = LoginForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): # All validation rules pass 
      username = request.POST['username'] 
      password = request.POST['password'] 
      redirect_to = request.REQUEST.get('next', '') 
      user = authenticate(username=username, password=password) 
      if user is not None: 
       if user.is_active: 
        # Redirect to a success page. 
        auth_login(request, user) 
        return HttpResponseRedirect(redirect_to) 
#     return render_to_response('login/logged_in.html', { 
#      'username': username, 
#      }) 
       else: 
        # Return a 'disabled account' error message 
        error = u'Account Disabled' 
        return errorHandle(error) 
      else: 
      # Return an 'invalid login' error message. 
       error = u'Invalid Login' 
       return errorHandle(error) 
     else: 
      error = u'Form is Invalid' 
      return errorHandle(error) 
    else: 
     form = LoginForm() # An unbound form 
     return render_to_response('login/login.html', { 
      'form': form, 
      }) 

шаблон

<div id="login_form"> 
<form action="." method="post"> 
    {{ form.as_p }} 
    <input type="submit" value="Login"> 
</form> 
</div> 

EDIT - я нашел проблему. Это проблема с моим шаблоном. Эта форма ниже работает нормально.

<form action="" method="post"> 
     <label for="username">User name:</label> 
     <input type="text" name="username" value="" id="username"> 
     <label for="password">Password:</label> 
     <input type="password" name="password" value="" id="password"> 

     <input type="submit" value="Login" id="button"/> 
     <input type="hidden" name="next" value="{{ next|escape }}" /> 
    </form> 
+3

Почему бы не использовать встроенный [login] (https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.views.login) просмотр? Почему бы не по крайней мере [посмотреть его код] (https://code.djangoproject.com/browser/django/trunk/django/contrib/auth/views.py#L25), чтобы узнать, как он перенаправляется? – DrTyrsa

+0

@DrTyrsa Я не знаю, как использовать встроенный логин:/можете ли вы найти проблему с этим кодом? – ChamingaD

+0

Вы читали [документы] (https://docs.djangoproject.com/en/dev/topics/auth/) в auth? Там что-то неясно? – DrTyrsa

ответ

2

Вы можете просто добавить это к виду:

<input type="hidden" value="{% if request.REQUEST.next %}{{ request.REQUEST.next }}{% else %}{% if request.META.HTTP_REFERER %}{{ request.META.HTTP_REFERER }}{% else %}/{% endif %}{% endif %}" name="next" /> 

Вот случаи он адресует:

  1. Если пользователь приходит из login_required зрения: рядом находится by login_required
  2. Если пользователь исходит из формы входа в систему (т.е. аутентификация не проходит): рядом = ранее установленное следующее значение
  3. Если пользователя приходит из не login_required зрения: рядом = с Referer URL
  4. Если пользователя непосредственно открыл страницу входа: следующий =/

Обратите внимание, что это также относится к внешним видам входа, которые вы должны использовать.

В качестве дополнения, вот часть моего шаблона выхода, который перенаправляет пользователя на страницу, на которой он был до выхода из системы.

{% block body %} 
    <p>{% trans "You've been logged out." %}</p> 
    {% if '/account/logout/' not in request.META.HTTP_REFERER %} 
    <p> 
     {% trans 'You will be redirected in a second' %} 
    </p> 
    {% endif %} 
{% endblock %} 

{% block extra_body %} 
    {% if '/account/logout/' not in request.META.HTTP_REFERER %} 
     <script type="text/javascript"> 
     document.location.href = '{{ request.META.HTTP_REFERER }}'; 
     </script> 
    {% endif %} 
{% endblock %} 

Я хотел бы поблагодарить большой стартап, который нанял меня sports pick, tipster social network, потому что они позволяют мне 0) общий код и 1) использовать часть моего времени, чтобы помочь другим. Но настоящая причина, по которой я ее связываю, - это проверить ее. Если этот код не работает для вас, как будто он работает там, у вас возникает другая проблема.

+2

Тот же вопрос: какой смысл изобретать [колесо] (https://code.djangoproject.com/browser/django/trunk/django/contrib/auth/views.py#L25)? – DrTyrsa

+0

Я думаю, что образовательная цель разумна. Лично я не делал ничего, связанного с логином в течение многих лет, был слишком занят, сосредоточившись на том, что отличает мое приложение ... благодаря Pinax для предоставления стартовых проектов, которые включают весь этот шаблон. Но раньше я работал над этим вручную, и это помогло мне понять, что происходит. – jpic

+2

Я думаю, изучение кода встроенного представления гораздо более полезно для образовательных целей. Например, можно узнать о тестовых файлах cookie и перенаправить проверки безопасности. – DrTyrsa

Смежные вопросы