gpt4 book ai didi

python - 获取 `django-registration` 将您带到您最初尝试访问的页面

转载 作者:太空狗 更新时间:2023-10-29 20:23:18 24 4
gpt4 key购买 nike

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

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

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

最佳答案

如果您查看负责通过电子邮件 (registration.views.activate) 激活帐户的 View ,您会看到它接受一个 success_url 参数,它是“URL 模式的名称重定向到成功激活。”

因此您只需覆盖调用该 View 的 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://..."
),

或者,您可以在自己的 View 中包含 django-registrations activate View ,并接受 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 是无状态的。

想到的第一个建议是在注册时将重定向保存在 session 变量中,然后在激活时检索它。为此,我们可以覆盖 django-registrations default backend (这只是一个具有概述注册过程功能并从 View 中调用的方法的类),特别是 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 将其提供给 View :

url(r'^activate/(?P<activation_key>\w+)/$',
activate,
{'backend': 'custombackend.RedirectBackend'},
name='registration_activate'),
url(r'^register/$',
register,
{'backend': 'custombackend.RedirectBackend'},
name='registration_register'),

关于python - 获取 `django-registration` 将您带到您最初尝试访问的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7930526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com