【问题标题】:Getting `django-registration` to send you to the page you were originally trying to visit让 `django-registration` 将您发送到您最初尝试访问的页面
【发布时间】:2023-04-01 03:34:01
【问题描述】:

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

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

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

【问题讨论】:

  • 您是在谈论注册时,还是通过电子邮件激活时?
  • 注册后,您通过电子邮件激活,然后当您完成激活后,我希望您会被重定向到您最初尝试访问的页面。

标签: python django django-authentication django-registration


【解决方案1】:

如果您查看负责通过电子邮件 (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-registrations activate 视图并接受 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. 用户激活电子邮件并被重定向到他们尝试查看的原始页面

这更加困难,因为他们在第一步中尝试查看的页面需要一直传递到第四步,而且我们知道,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'),

【讨论】:

  • 这是下半场。前半部分呢,将正确的next URL 与注册的人连接起来?
  • 我不明白你的意思
  • 重点是重定向到用户最初尝试访问的视图,而不是固定的 URL。那么您将如何保存并在以后检索用户最初尝试访问的 URL?
  • 我已经用动态 URL(即用户最初尝试查看的 URL)激活后重定向的方法更新了我的答案
【解决方案2】:

您应该使用相同的装饰器@login_required,django-registration 也使用它。

【讨论】:

  • 这会导致用户在注册后被重定向到他们试图访问的原始页面吗?
猜你喜欢
  • 2012-03-17
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多