在django-registration中传播“?next=”的含义是什么?

6
我有一个视图,它有@login_required装饰器。当你打开这个页面时,如果你没有登录,它会将你发送到登录窗口,并在URL中带上正确的"?next=/url/you/tried/to/see"。
我的问题是如何将这个“?next”值传递给随后的表单和激活电子邮件,以便用户完成激活过程后重定向到他们最初尝试访问的视图。
我的Python和Django都不太好,所以请保持答案易于理解。
提前感谢大家。
3个回答

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

1
那在登录模板里,但是在那个模板上有一个注册链接。那个注册模板没有捕捉到 {{ next }} ,将其放入模板代码中会渲染出 type="hidden" name="next" value=""。 - ChronosLLC
我没有登陆页面,因为django-registration集成/使用contrib.auth。在django-registration的urs.py中有: from django.contrib.auth import views as auth_views然后在patterns(''...)中有: url(r'^register/complete/$', direct_to_template, {'template': 'registration/registration_complete.html'}, name='registration_complete'), )我想我的主要问题是我不知道如何将extra_context传递给这些与django-registration一起提供的视图。 - ChronosLLC
我已经成功添加了正确的代码,以便在所有模板中都可以看到request.REQUEST,但发送到默认后端的电子邮件仍存在问题,它没有获取或传递下一个值。 - ChronosLLC

1
你可以这样做:<a href="{% url 'app:sign_up' %}?next={{ next }}">

0

很简单,只需保存URL并编写自己的后端覆盖2个方法即可。

accounts/models.py

class UserNext(models.Model):
    user = models.OneToOneField(User)
    url = models.CharField(max_length=255, blank=True, null=True)

accounts/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'),

应该可以工作,但我没有测试过,是临时写的。显然需要添加一些导入。


谢谢Zalew-我想我可以做这样的事情,但是我希望在某个时候集成Facebook Connect,所以如果解决方案只是做一个自定义后端,那么我将在未来添加FB时就这样做。再次感谢大家的答案,它们确实有所帮助。Stackoverflow社区有一些很棒的人。 JY - ChronosLLC
如果你想使用外部账户注册,http://github.com/flashingpumpkin/django-socialregistration 可以帮到你,祝好运。 - zalew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接