Ram*_*hum 9 python django django-authentication django-registration
django.contrib.auth有一个很棒的功能:当您尝试访问由装饰的页面时login_required,您将被重定向到带有next参数的登录页面,因此在您登录后,您将被重定向回您最初尝试访问的页面.这对用户流程有好处.
但是,显然django-registration没有提供类似的功能.我希望如果你注册而不是登录,你也会得到一个next东西,并且在注册后激活你将被重定向到你最初试图访问的页面.情况并非如此,您只是被重定向到某个成功页面.这会伤害流动.
是否django-registration可能提供这样的选项,但我不使用它或正确?或者有一个简单的方法来做到这一点?
Tim*_*ony 12
如果您通过电子邮件(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://..."
),
Run Code Online (Sandbox Code Playgroud)
或者,您可以在自己的视图中包装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)
Run Code Online (Sandbox Code Playgroud)
现在,在您的模板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!
Run Code Online (Sandbox Code Playgroud)
编辑
好的,所以上面涉及硬编码重定向.我猜这是你想要的流程:
这比较困难,因为他们试图在第一步中查看的页面需要一直传递到第四步,而且正如我们所知,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'], (), {})
Run Code Online (Sandbox Code Playgroud)
为了确保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'),
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2392 次 |
| 最近记录: |