我有一个具有 @login_required 装饰器的视图,并且在拉起页面时,如果您没有登录,它会使用正确的 ?next=/url/you/tried/to/see 将您发送到登录表单
我的问题是如何将该 ?next 值传递给后续表单和激活电子邮件,以便当用户完成激活过程时,他们将被重定向到他们最初尝试访问的视图。
我的 Python'foo 和 Django'foo 很弱,所以请保留 5 岁孩子可以遵循的答案;)
提前谢谢大家。
我有一个具有 @login_required 装饰器的视图,并且在拉起页面时,如果您没有登录,它会使用正确的 ?next=/url/you/tried/to/see 将您发送到登录表单
我的问题是如何将该 ?next 值传递给后续表单和激活电子邮件,以便当用户完成激活过程时,他们将被重定向到他们最初尝试访问的视图。
我的 Python'foo 和 Django'foo 很弱,所以请保留 5 岁孩子可以遵循的答案;)
提前谢谢大家。
默认情况下,内置视图会处理此问题。确保你有这段代码:<input type="hidden" name="next" value="{{ next }}" />
在你的登录页面模板中。
你可以这样做<a href="{% url 'app:sign_up' %}?next={{ next }}">
这很简单,只需保存 url 并编写自己的后端覆盖 2 个方法。
帐户/模型.py
class UserNext(models.Model):
user = models.OneToOneField(User)
url = models.CharField(max_length=255, blank=True, null=True)
帐户/nextbackend.py:
from registration.backends.default import DefaultBackend
from django.core.urlresolvers import resolve
from accounts.models import UserNext
class NextBackend(DefaultBackend):
def register(self, request, **kwargs):
username, email, password = kwargs['username'], kwargs['email'], kwargs['password1']
if Site._meta.installed:
site = Site.objects.get_current()
else:
site = RequestSite(request)
new_user = RegistrationProfile.objects.create_inactive_user(username, email,
password, site)
signals.user_registered.send(sender=self.__class__,
user=new_user,
request=request)
next, created = UserNext.objects.get_or_create(user=new_user)
next.url = request.GET.get('next',None) # or POST, don't know how you want to pass it
next.save()
return new_user
def post_activation_redirect(self, request, user):
next = UserNext.objects.get(user=user)
view, args, kwargs = resolve(next.url)
return (view, args, kwargs)
在 accounts/views.py 中使用 this^ 后端作为您的注册后端:
def custom_register(request):
return register(request, backend='accounts.nextbackend.NextBackend',)
网址.py:
url(r'^accounts/register/$', 'accounts.views.custom_register', name='registration_register'),
应该可以工作,没有测试,即时编写。显然需要添加一些进口。