Отображение «Отмена» на странице входа, чтобы вернуть пользователя туда, где он был (используя django.contrib.auth) - PullRequest
0 голосов
/ 20 февраля 2012

Мы используем декоратор @login_required, чтобы пользователи видели страницу входа в систему, если они пытаются получить URL-адрес, для которого им необходимо пройти аутентификацию. Мы хотим показать кнопку «Отмена» на странице входа в систему, которая должна вернуть пользователя на ту страницу, на которой он находился, когда он пытался получить доступ к URL (нажав ссылку и т. Д. - нам не нужно иметь дело с тем, что он вводил вручную). URL).

На данный момент наш login.html ищет параметр запроса 'login_cancel_url' и использует его (в противном случае - домашнюю страницу).

Однако это означает, что мы должны вручную передавать этот параметр (заданный в качестве URL-адреса текущей страницы) всякий раз, когда мы показываем ссылку или кнопку, которая приводит к URL-адресу «требуется проверка подлинности».

Есть ли более элегантный способ сделать это?

Спасибо, Мартин

1 Ответ

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

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

Вы легко можете получить текущий URL-адрес из объекта request django на любой странице, поэтому вместо установки его вручную по ссылке вы можете написать фрагмент HTML:

link_to_login.html

<!-- You should probably get /login/ using the {% url ... %} template tag -->
<a href="/login/?login_cancel_url={{ request.path|urlencode }}">
Login Page</a>

и используйте шаблонный тег {% include "link_to_login.html"%}.

В качестве альтернативы, Если текст должен отличаться в зависимости от ссылки, вместо этого можно создать тег шаблона включения :

templatetags / extra_auth_tags.py

@register.inclusion_tag('templates/extra_auth_tags/login_link.html')
def login_link(context, text=None):
return {
    'text':text
}

шаблоны / extra_auth_tags / login_link.html

<!-- You should probably get /login/ using the {% url ... %} template tag -->
<a href="/login/?login_cancel_url={{ request.path|urlencode }}">
{% if text %}
    {{ text }}
{% else %}
    Some Default Text
{% endif %}
</a>

и затем назовите его в своих шаблонах как {% login_link text="Check you messages" %}. Помните, что ключевые аргументы для тегов включения поддерживаются только в версии django dev, поэтому вам может потребоваться написать тег шаблона вручную.

...