gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:44:20 24 4
gpt4 key购买 nike

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

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

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

但是,对于没有帐户的用户,登录页面有一个指向注册页面的链接,我想将“下一步”设置为原始表单页面,以便他们注册后重定向回原始表单。有什么想法或建议吗?

最佳答案

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

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

如果您正在使用 Django 的内置 login View ,并为其创建了自己的模板,那么 Django 会将 next 的当前值传递给模板,如下所示一个名为(适本地)next 的上下文变量。您可以像这样在注册页面的链接中使用它:

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

因此,在您创建的用于处理用户注册页面的 View 中,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

最后,在同一个注册 View 中,当您响应 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 是很常见的。函数能够成功解决它。

关于django - 如何在 Django 中设置 "next"上下文变量,以便将用户重定向到适当的页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29724279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com