如何在 Django 中设置 "next" 上下文变量,以便将用户重定向到适当的页面?

How do I set the "next" context variable in Django so I can redirect my user to the appropriate page?

我知道有一个名为 "next" 的上下文变量,它允许您指定 URL 重定向到页面之后,这在您要重定向用户时通常使用到登录页面,然后在他们登录后将他们重定向回登录页面之前所在的页面。

在我看来,我已经通过 URL 手动设置它,例如重定向到 /login/?next=/someurl,但这不是一个干净的方法。我试过谷歌搜索等,但令人惊讶的是,网上关于它的信息很少。

你究竟是如何设置上下文变量的"next"?我的站点有一个任何人都可以看到的表单,但只有登录用户才能提交。现在,如果用户未登录,他们将被重定向到附加“?next=/someurl/”的登录页面,以便他们在登录后返回到原始表单。

但是,对于没有帐户的用户,从登录页面有一个 link 到注册页面,我想将 "next" 设置为原始表单页面这样在他们注册后,他们就会被重定向回原来的形式。有什么想法或建议吗?

听起来你不想简单地将 next 用于一个重定向,而是在两个重定向中坚持使用它: 某个表单页面 -> 登录 -> 注册 -> 返回某个表单

对于登录页面本身,Django 提供了一些自动帮助(如果您使用内置的 auth 视图)。但是注册页面的第二跳需要一些自定义代码,如下所述。

如果您正在使用 Django 的内置 login 视图,并为其创建了自己的模板,那么 Django 会将 next 的当前值作为上下文变量传递给模板,调用(适当地)next。您可以在 link 中使用它到您的注册页面,如下所示:

<a href="{% url 'your_signup_page' %}{% if next %}?next={{ next }}{% endif %}">Sign me up!</a>

因此,在您创建的用于处理用户注册页面的视图中,next 的值将作为 GET 参数访问:

def signup(request):
    if request.method == 'GET':
        next = request.GET.get('next', None)
        if next:
            # Add it as a hidden input in your signup form
            # Or re-append it as a GET param
            # Or stick it in the user's session, which is
            # what this example does:
            request.session['next'] = next

最后,在同一个注册视图中,当您响应 POSTed 注册表单时,以您选择在 GET 请求中传播它的任何方式检索 next 值,并重定向到它的值。

def signup(request):
    ....
    # POST handling section
    if signup_form.is_valid():
        next = request.session.get('next', None)
        if next:
            # See caution note below!
            return redirect(next)

注意事项:

请注意,在处理注册表单后重定向到 next 值之前,您应该检查并清理该值,以防止浏览器端篡改。例如,通常会验证 URL 是否属于您自己的域(如果合适的话)and/or Django 的 resolve 函数能够成功解析它。