Django: перенаправление на предыдущую страницу после входа в систему - PullRequest
162 голосов
/ 30 апреля 2009

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

EDIT: Я понял. Я связался с формой входа, передав текущую страницу в качестве параметра GET, а затем использовал «следующий» для перенаправления на эту страницу. Спасибо!

РЕДАКТИРОВАТЬ 2: Мое объяснение, казалось, не было ясным, так как запрошенный здесь мой код: Допустим, мы находимся на странице foo.html и не вошли в систему. Теперь нам нужна ссылка на foo.html, которая ссылается на login.html. Там мы можем войти и затем перенаправлены обратно в foo.html. Ссылка на foo.html выглядит так:

      <a href='/login/?next={{ request.path }}'>Login</a> 

Теперь я написал собственный вид входа в систему, который выглядит примерно так:

def login_view(request):
   redirect_to = request.REQUEST.get('next', '')
   if request.method=='POST':
      #create login form...
      if valid login credentials have been entered:
         return HttpResponseRedirect(redirect_to)  
   #...
   return render_to_response('login.html', locals())

И важная строка в login.html:

<form method="post" action="./?next={{ redirect_to }}">

Так что да, вот и все, надеюсь, это прояснит.

Ответы [ 9 ]

139 голосов
/ 11 ноября 2009

Для этого вам не нужно делать дополнительный просмотр, функциональность уже встроена.

Сначала каждая страница со ссылкой для входа должна знать текущий путь, и самый простой способ - добавить препроцессор контекста запроса в settings.py (4 по умолчанию - по умолчанию), затем объект запроса будет доступен в каждом запросе :

settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.request",
)

Затем добавьте в шаблон нужную вам ссылку для входа:

base.html:

<a href="{% url django.contrib.auth.views.login %}?next={{request.path}}">Login</a>

Это добавит аргумент GET на страницу входа, которая будет указывать на текущую страницу.

Шаблон входа в систему может быть таким простым:

регистрация / login.html:

{% block content %}
<form method="post" action="">
  {{form.as_p}}
<input type="submit" value="Login">
</form>
{% endblock %}
26 голосов
/ 30 апреля 2009

Возможно, это не «лучшая практика», но я успешно использовал это раньше:

return HttpResponseRedirect(request.META.get('HTTP_REFERER','/'))
22 голосов
/ 28 ноября 2012

Для поддержки полных URL с параметрами / значениями вам понадобится:

?next={{ request.get_full_path|urlencode }}

вместо просто:

?next={{ request.path }}
14 голосов
/ 30 апреля 2009

Встроенная аутентификация Django работает так, как вы хотите.

Их страницы входа включают строку запроса next, которая является страницей, к которой можно вернуться после входа в систему.

Посмотрите на http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.login_required

1 голос
/ 02 февраля 2012

В registration/login.html (вложено в папку templates), если вы вставите следующую строку, страница отобразится как оригинальная страница входа администратора Django:

{% include "admin/login.html" %}

Примечание. Файл должен содержать только строки выше.

1 голос
/ 05 марта 2010

Я столкнулся с той же проблемой. Это решение позволяет мне использовать общий вид входа в систему:

urlpatterns += patterns('django.views.generic.simple',
    (r'^accounts/profile/$', 'redirect_to', {'url': 'generic_account_url'}),
)
1 голос
/ 30 апреля 2009

Я связался с формой входа, передав текущую страницу в качестве параметра GET, а затем использовал «следующий» для перенаправления на эту страницу. Спасибо!

0 голосов
/ 17 мая 2013

Вы также можете сделать это

<input type="hidden" name="text" value="{% url 'dashboard' %}" />
0 голосов
/ 30 апреля 2009

См. Django docs для views.login () , вы вводите «следующее» значение (как скрытое поле) в форму ввода для перенаправления после успешного входа.

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