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

时间:2015-04-19 00:03:00

标签: django url redirect django-context

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

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

你究竟如何设置“下一个”上下文变量?我的网站有一个任何人都可以看到的表单,但只有登录的用户才能提交。现在,如果用户没有登录,他们将被重定向到登录页面,并附上“?next = / someurl /”,这样一旦他们登录就会被发送回原始表单。

但是,从登录页面可以找到没有帐户的用户注册页面的链接,我想将“next”设置为原始表单页面,以便在他们注册后重定向回原始表单。任何想法或建议?

1 个答案:

答案 0 :(得分:0)

听起来您不想简单地使用next进行一次重定向,而是将其保留在两个重定向中:     一些表单页面 - >登录 - >注册 - >回到某种形式

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

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

<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属于您自己的域(如果合适)和/或Django的resolve函数能够成功解析它。