Django:文章详情页面评论功能需要登录后才能使用,登录后自动返回到文章详情页

背景:

  文章详情页正在查看文章,想评论一下写的不错,但是需要先登录才能。页面长这个样子:

 

方案:

 

  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_url
    if request.method == 'GET':
        # 获取从url传递来的登录前的url
        cur_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对象,否则返回None
            user = 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'] = True
        request.session['username'] = cd['username']
        #设置session有效期为?秒,不管操作不操作系统,10秒后都会自动失效
        # request.session.set_expiry(6000)

        # 校验成功后跳转至登录前的页面
        return redirect(cur_url)

  

 

posted @ 2019-06-17 15:03  秋寻草  阅读(726)  评论(0编辑  收藏  举报