如果您查看负责通过电子邮件 ( 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!
编辑
好的,以上处理的是硬编码重定向。我猜这是你想要的流程:
- 用户尝试转到某个页面
- 用户被重定向到登录/注册页面
- 用户在该页面上注册并收到一封电子邮件
- 用户激活电子邮件并被重定向到他们尝试查看的原始页面
这更加困难,因为他们在第一步中尝试查看的页面需要一直传递到第四步,而且我们知道,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'),