让'django-registration`将您发送到您最初尝试访问的页面

时间:2011-10-28 14:23:57

标签: python django django-authentication django-registration

django.contrib.auth有一个很棒的功能:当您尝试访问由login_required修饰的页面时,您将被重定向到带有next参数的登录页面,因此在您登录后重定向回到您最初尝试访问的页面。这对用户流程有好处。

但是,显然django-registration没有提供类似的功能。我希望如果你注册而不是登录,你也会得到一个next的东西,并且在注册-n'激活后你将被重定向到你最初试图访问的页面。情况并非如此,您只是被重定向到某个成功页面。这会伤害流量。

django-registration是否可能提供此选项,但我没有正确使用它?或者有一种简单的方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:12)

如果您通过电子邮件(registration.views.activate)查看负责激活帐户的视图,您会看到它接受 success_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-registrations激活视图,并接受一个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 / activation_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!

修改

好的,所以上面涉及硬编码重定向。我猜这是你想要的流程:

  1. 用户尝试转到某个页面
  2. 用户被重定向到登录/注册页面
  3. 用户在该页面上注册并收到电子邮件
  4. 用户激活电子邮件并重定向到他们尝试查看的原始页面
  5. 这比较困难,因为他们试图在第一步中查看的页面需要一直传递到第四步,而且正如我们所知,HTTP是无状态的。

    首先想到的是在注册时将重定向保存在会话变量中,然后在激活时检索它。为此,我们可以覆盖django-registrations default backend(这只是一个类,其中的方法概述了注册过程的功能并从视图中调用),特别是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'),
    

答案 1 :(得分:-4)

你应该使用相同的装饰者@login_required,django-registration也会使用它。