传播?next =在django-registration中

时间:2010-07-04 20:02:24

标签: django django-registration

我有一个包含@login_required装饰器的视图,在提取页面时,如果您没有登录,它会将您发送到正确的登录表单吗?next = / url / you / trying / to / see

我的问题是如何传递后续表格和激活电子邮件的下一个值,以便当用户完成激活过程时,他们会被重定向到他们最初尝试访问的视图。

我的Python'foo和Django'foo很弱,所以请保留一个5岁的孩子可以跟随的答案;)

先谢谢大家。

3 个答案:

答案 0 :(得分:2)

这很简单,只需保存网址并编写自己的后端,覆盖2种方法。

账户/ models.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中的注册后端:

def custom_register(request):
            return register(request, backend='accounts.nextbackend.NextBackend',)

urls.py:

url(r'^accounts/register/$', 'accounts.views.custom_register', name='registration_register'),

应该工作,没有测试,动态写。显然需要添加一些进口。

答案 1 :(得分:1)

内置视图默认处理此问题。确保您在登录页面模板中有这段代码:<input type="hidden" name="next" value="{{ next }}" />

答案 2 :(得分:1)

您可以<a href="{% url 'app:sign_up' %}?next={{ next }}">