我知道有一个名为“next”的上下文变量,它允许您指定在页面后重定向到的URL,这通常在您希望将用户重定向到登录页面时使用,然后重定向它们回到他们登录后登录页面之前的页面。
在我看来,我已经通过URL手动设置它,例如重定向到/ login /?next = / someurl,但这不是一个干净的方法。我已经尝试使用谷歌搜索等,但在网上的信息却令人惊讶。
你究竟如何设置“下一个”上下文变量?我的网站有一个任何人都可以看到的表单,但只有登录的用户才能提交。现在,如果用户没有登录,他们将被重定向到登录页面,并附上“?next = / someurl /”,这样一旦他们登录就会被发送回原始表单。
但是,从登录页面可以找到没有帐户的用户注册页面的链接,我想将“next”设置为原始表单页面,以便在他们注册后重定向回原始表单。任何想法或建议?
答案 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
函数能够成功解析它。