背景:
文章详情页正在查看文章,想评论一下写的不错,但是需要先登录才能。页面长这个样子:
方案:
1、点击登录链接时,将该页面的URL传递到登录视图中
request.path获取的是当前页面的相对路径
请<a href="{% url 'account:user_login' %}?cur_url={{ request.path }}">登录</a>后回复
登录时的URL如下图,会带上之前页面的相对url
2、在登录视图中获取该cur_url的值,等待登录成功后跳转
def user_login(request):# 定义为全局变量,post登录请求后依然可以使用该变量进行跳转global cur_urlif request.method == 'GET':# 获取从url传递来的登录前的urlcur_url = request.GET.get('cur_url')login_form = LoginForm()return render(request, "account/login2.html", {"form": login_form})if request.method == 'POST':#request.POST将前台数据传递给表单类,生成一个绑定实例login_form = LoginForm(request.POST)#如果数据合法则进行数据清洗,返回输入的数据(字典格式)if login_form.is_valid():cd = login_form.cleaned_data# 如果给定的凭据有效则返回一个User对象,否则返回Noneuser = authenticate(username=cd['username'], password=cd['password'])if user:#如果user不为None(既通过了凭据验证返回了user对象),使用系统自带的login方法登录login(request, user)else:error_msg = "账号与密码不匹配"return render(request, 'account/login2.html', {'form': login_form, 'error_msg': error_msg})else:error_msg = '请输入合法数据'return render(request, 'account/login2.html', {'form': login_form, 'error_msg': error_msg})# 设置session信息request.session['is_login'] = Truerequest.session['username'] = cd['username']#设置session有效期为?秒,不管操作不操作系统,10秒后都会自动失效# request.session.set_expiry(6000)# 校验成功后跳转至登录前的页面return redirect(cur_url)