通过多个页面重定向(登录-->;注册-->;登录),而不丢失django中第一页url的下一个参数
我可能没有在标题中进行说明,但我想要的是,例如,当一个新用户打开一个需要登录的页面-->时,他会被重定向到登录页面,并且登录url具有上一页面的下一个参数。但是,由于他是一个新用户,他选择通过单击登录页面上的链接进行注册,该链接将引导他注册页面,现在问题来了-注册url没有参数,一旦用户注册,他会自动重定向到登录页面,在他登录后,他会重定向到索引页面,而不是需要登录的页面。我有一个自定义用户模型,这是我的登录视图:通过多个页面重定向(登录-->;注册-->;登录),而不丢失django中第一页url的下一个参数,django,Django,我可能没有在标题中进行说明,但我想要的是,例如,当一个新用户打开一个需要登录的页面-->时,他会被重定向到登录页面,并且登录url具有上一页面的下一个参数。但是,由于他是一个新用户,他选择通过单击登录页面上的链接进行注册,该链接将引导他注册页面,现在问题来了-注册url没有参数,一旦用户注册,他会自动重定向到登录页面,在他登录后,他会重定向到索引页面,而不是需要登录的页面。我有一个自定义用户模型,这是我的登录视图: def login(request): if request.user.
def login(request):
if request.user.is_authenticated:
return redirect('/')
else:
if request.method == "POST":
email=request.POST['email']
password=request.POST['password']
user=auth.authenticate(email=email,password=password)
if user is not None:
auth.login(request, user)
next_page = request.POST['next']
if next_page != '':
return redirect(next_page)
else:
return redirect('/')
else:
messages.info(request,"Email Password didn't match")
next = request.POST['next']
if next != '':
login_url = reverse('login')
query_string = urlencode({'next': next})
url = '{}?{}'.format(login_url, query_string) # create the url
return redirect(url)
else:
return redirect('login')
else:
return render(request,"login.html")
和注册视图:
def signup(request):
next = request.GET.get('next', '')
if request.user.is_authenticated:
return redirect('/')
else:
if request.method == "POST":
first_name=request.POST['first_name']
last_name=request.POST['last_name']
email=request.POST['email']
mobile=request.POST['mobile']
password=request.POST['password']
cpassword=request.POST['cpassword']
signup_uri = f'/signup?next={next}'
if password==cpassword:
if User.objects.filter(email=email).exists():
messages.info(request,'Email already in use')
return redirect(signup_uri)
elif User.objects.filter(mobile=mobile).exists():
messages.info(request,'Mobile Number already in use')
return redirect(signup_uri)
else:
user=User.objects.create_user(first_name=first_name,last_name=last_name,email=email,password=password,mobile=mobile)
user.save();
return redirect(f'/login?next={next}')
else:
messages.info(request,'Passwords not matching')
return redirect('signup_uri')
else:
return render(request,'signup.html')
所以我想要的是:登录url中的下一个参数被带到注册url,然后被带回到登录url,用户登录后可以从那里重定向到下一个页面。我一直试图找出这个问题,从很长一段时间以来,现在,但我无法找到任何解决方案,所以任何帮助将不胜感激。谢谢我假设在您的
login.html
模板中有一个注册链接(例如/signup
)。您所需要做的就是读取您在登录
视图中获得的下一个查询参数的值,并将其传递给您的登录.html
模板,这样您就可以创建一个注册链接,如/signup?next=next\u值
。然后,可以在注册视图中读取next
query param的值,如果用户创建成功,我们可以按如下方式修改代码:
# User has been created
if next_value:
return redirect(next_value)
else:
return redirect('/login/')
您可以通过将
next
作为querystring参数传递到注册视图来实现这一点
首先,您需要在您的login.html
模板中的注册链接中添加下一个
,在我的例子中如下所示:
<div>
Don't have an account?<a href="{% url 'signup' %}?next={{ next }}"> Sign Up</a>
</div>
现在,在您的注册\u视图中
,只需将下一步
参数与重定向一起传入即可:
def signup_view(request):
next = request.GET.get('next', '')
if request.user.is_authenticated:
return redirect(next)
if request.method != "POST":
return render(request, 'signup.html')
first_name=request.POST['first_name']
email=request.POST['email']
password=request.POST['password']
cpassword=request.POST['cpassword']
signup_uri = f'signup?next={next}'
if password != cpassword:
messages.info(request,'Passwords not matching')
return redirect(signup_uri)
if User.objects.filter(email=email).exists():
messages.info(request,'Email already in use')
return redirect(signup_uri)
else:
user=User.objects.create_user(first_name=first_name,email=email,password=password)
user.save();
return redirect(f'/login?next={next}')
但在我的网站中,用户必须在注册后登录,因此注册后,他应该被重定向到登录页面,并从那里重定向到产品视图页面。您可以重定向到/login?next=next_值,应该是fine。在登录视图的上下文中传递next时会发生什么?我在问题中更新了我的注册视图。我所面临的问题是,当我在请求后
print(next)
就在def signup
下面时,GET it会正确地打印我需要的内容,但是这个next不会显示在signup_uri以及f'/login?next={next}'
@VATSALJAIN中,首先,你不应该传递一个字符串来重定向。因此,行:return redirect('signup_uri')
应该是:return redirect(signup_uri)
@VATSALJAIN同样,当您打印(redirect_uri)
时会发生什么?
def signup_view(request):
next = request.GET.get('next', '')
if request.user.is_authenticated:
return redirect(next)
if request.method != "POST":
return render(request, 'signup.html')
first_name=request.POST['first_name']
email=request.POST['email']
password=request.POST['password']
cpassword=request.POST['cpassword']
signup_uri = f'signup?next={next}'
if password != cpassword:
messages.info(request,'Passwords not matching')
return redirect(signup_uri)
if User.objects.filter(email=email).exists():
messages.info(request,'Email already in use')
return redirect(signup_uri)
else:
user=User.objects.create_user(first_name=first_name,email=email,password=password)
user.save();
return redirect(f'/login?next={next}')