django - 通过多个页面重定向(登录->注册->登录)而不会丢失django第一页中url的下一个参数
问题描述
我可能没有在标题中进行描述,但我想要的是例如当一个新用户打开一个需要登录的页面时——>他被重定向到登录页面,登录 url 具有上一页的下一个参数。但是由于他是新用户,他选择通过单击登录页面上的链接进行注册,该链接将他带到注册页面,现在这就是问题所在 - 注册网址没有参数,一旦用户注册,他就会自动重定向到登录页面,在他登录后,他被重定向到索引页面,而不是需要登录的页面。我有一个自定义用户模型,这是我的登录视图:
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,登录后用户可以从那里被重定向到下一页。很长一段时间以来我一直试图找出这个问题,但我无法找到任何解决方案,因此我们将不胜感激。谢谢
解决方案
您可以通过作为查询字符串参数传递next
给您的注册视图来完成此操作。
首先,您需要next
在模板中添加注册链接,login.html
在我的例子中如下所示:
<div>
Don't have an account?<a href="{% url 'signup' %}?next={{ next }}"> Sign Up</a>
</div>
然后,确保您将next
作为上下文传递给您的模板login_view
:
def login_view(request):
...
else:
next = request.GET.get('next', '')
render(request, 'login.html', {'next': next})
现在在您的 中signup_view
,只需将next
参数与您的重定向一起传递:
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}')
推荐阅读
- java - SpringBoot:绕过 OncePerRequestFilter 过滤器
- python - Python 子进程打开我的 Pycharm 文件夹和 Jupyter 文件夹而不是目标
- ios - 代码签名错误:SDK“iOS 11.4”中的产品类型“应用程序”需要代码签名
- laravel - Laravel 5 - 将 Auth 模块移入特定模块
- wordpress - 全球 $product 为空 - Timber + Woocommerce
- go - Go 全局变量初始化
- excel - 数据到位后停止运行公式
- xsl-fo - 指定自定义字体
- javascript - aspx页面不调用ajax方法
- xml - 取消注释 web.config 中的标记