Django: перенаправление на предыдущую страницу после входа в систему
Я пытаюсь создать простой веб-сайт с функциями входа в систему, очень похожим на тот, который находится здесь, на SO.
Пользователь должен иметь возможность просматривать сайт как анонимный пользователь, и на каждой странице будет ссылка для входа. При нажатии на ссылку входа пользователь будет отправлен в форму для входа. После успешного входа в систему пользователь должен быть возвращен на страницу, откуда он первым нажал ссылку на вход.
Я предполагаю, что мне нужно каким-то образом передать url текущей страницы в представление, которое обрабатывает форму входа, но я не могу заставить ее работать.
EDIT:
Я понял. Я связался с формой входа, передав текущую страницу как параметр GET, а затем использовал "next" для перенаправления на эту страницу. Спасибо!
ИЗМЕНИТЬ 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 }}">
Так что да, это очень много, надеюсь, что это ясно.
Ответы
Ответ 1
Вам не нужно делать дополнительный просмотр для этого, функциональность уже встроена.
Сначала каждая страница со ссылкой для входа должна знать текущий путь, а самый простой способ - добавить препроцессор контекста запроса к параметрам settings.py(первые по умолчанию - по умолчанию), тогда объект запроса будет доступен в каждом запросе
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 %}
Ответ 2
Это не может быть "лучшей практикой", но я успешно использовал это раньше:
return HttpResponseRedirect(request.META.get('HTTP_REFERER','/'))
Ответ 3
Чтобы поддерживать полные URL-адреса с параметрами/значениями, которые вам нужны:
?next={{ request.get_full_path|urlencode }}
вместо просто:
?next={{ request.path }}
Ответ 4
Встроенная аутентификация Django работает так, как вы хотите.
Их страницы входа включают строку запроса next
, которая является страницей для возврата после входа в систему.
Посмотрите http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.login_required
Ответ 5
Я связался с формой входа, передав текущую страницу как параметр GET, а затем использовал "next" для перенаправления на эту страницу. Спасибо!
Ответ 6
Я столкнулся с той же проблемой. Это решение позволяет мне использовать общий вид входа в систему:
urlpatterns += patterns('django.views.generic.simple',
(r'^accounts/profile/$', 'redirect_to', {'url': 'generic_account_url'}),
)
Ответ 7
В registration/login.html
(вложенном в папку templates
), если вы вставляете следующую строку, страница будет отображаться как оригинальная страница входа администратора Django:
{% include "admin/login.html" %}
Примечание. Файл должен содержать только указанные выше строки.
Ответ 8
См. django docs для views.login(), вы указываете "следующее" значение (как скрытое поле) в форме ввода для перенаправления после успешного входа в систему.
Ответ 9
Вы также можете сделать это
<input type="hidden" name="text" value="{% url 'dashboard' %}" />