Получение `django-registration` для отправки вас на страницу, которую вы изначально пытались посетить - PullRequest
9 голосов
/ 28 октября 2011

django.contrib.auth имеет потрясающую функцию: когда вы пытаетесь получить доступ к странице, которая оформлена с помощью login_required, вы перенаправляетесь на страницу входа с аргументом next, поэтому после входа вы будете перенаправлены обратно на страницу вы изначально пытались получить доступ. Это хорошо для пользовательского потока.

Но , по-видимому, django-registration не предоставляет аналогичную функцию. Я ожидал, что если вы зарегистрируетесь вместо входа в систему, вы также получите next вещь, и после регистрации-n-активации вы будете перенаправлены на страницу, которую первоначально пытались посетить. Это не тот случай, вы просто перенаправлены на страницу успеха. Это вредит потоку.

Возможно, django-registration предоставляет эту опцию, но я ее не использую или неправильно? Или есть простой способ сделать это?

Ответы [ 2 ]

12 голосов
/ 31 октября 2011

Если вы посмотрите на представление, ответственное за активацию учетной записи по электронной почте ( registration.views.activate ), вы увидите, что оно принимает параметр success_url , который равен " Имя шаблона URL, на который будет перенаправляться при успешной активации. "

Таким образом, вам просто нужно переписать URL, который вызывает это представление, и указать страницу, на которую вы хотите перенаправить.

Так по-вашему urls.py :

from registration.views import activate
urlpatterns = patterns('',
    url(r'^activate/(?P<activation_key>\w+)/$',
            activate,
            {'backend': 'registration.backends.default.DefaultBackend'},
            name='registration_activate',
            # You could use reverse() here instead of a URL to be DRY'er
            success_url = "http://..." 
            ),

В качестве альтернативы вы можете заключить django-регистрации, активировать представление в своем собственном представлении и принять параметр GET для перенаправления на:

from registration.view import activate
def custom_activate(request, backend,
         template_name='registration/activate.html',
         success_url=None, extra_context=None, **kwargs):
    success_url = request.GET.get('next', None)
    return activate(request, template_name=template_name, success_url=success_url, extra_context=None, **kwargs)

Теперь в вашем шаблоне registration / activ_email.html вы можете добавить место перенаправления к ссылке:

{% url 'registration.view.activate' activation_key as a_url %}

Thanks! ....

{% autoescape off %}
<a href="http://{{ site.domain }}{{ a_url }}?next='http://somepage_or_url'">
    http://{{ site.domain }}{{ url_registration_activate }}/
</a>
{% endautoescape %}

Thanks!

EDIT

Хорошо, вышеизложенное относится к жестко закодированным перенаправлениям. Я предполагаю, что это поток, который вы хотите:

  1. Пользователь пытается перейти на страницу
  2. Пользователь перенаправляется на страницу входа / регистрации
  3. Пользователь регистрируется на этой странице и получает электронное письмо
  4. Пользователь активирует электронную почту и перенаправляется на исходную страницу, которую он пытался просмотреть

Это сложнее, поскольку страницу, которую они пытались просмотреть на первом шаге, нужно пройти до четвертого шага, и, как мы знаем, HTTP не имеет состояния.

Первое, что приходит на ум, - сохранить перенаправление в переменной сеанса при регистрации, а затем извлечь его при активации. Для этого мы можем перезаписать django-registrations бэкэнд по умолчанию (это просто класс с методами, которые описывают функциональность процесса регистрации и вызываются из представлений), в частности методы register и post_activation_redirect:

custom_backend.py

from registration.backends.default import DefaultBackend
class RedirectBackend(DefaultBackend):
    def register(self, request, **kwargs):
        request.session['redirect'] = request.GET.get("next",None)
        super(RedirectBackend, self).register(request, **kwargs)

    def post_activation_redirect(self, request, user):
        return(request.session['redirect'], (), {})

и чтобы django-registration действительно использовал этот бэкэнд, мы предоставляем его представлениям через наш urls.py:

url(r'^activate/(?P<activation_key>\w+)/$',
    activate,
    {'backend': 'custombackend.RedirectBackend'},
    name='registration_activate'),
url(r'^register/$',
    register,
    {'backend': 'custombackend.RedirectBackend'},
    name='registration_register'),
0 голосов
/ 29 октября 2011

Вы должны использовать тот же декоратор @login_required, что и django-registration.

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