代码改变世界

131-使用login_required(),以及将当前的操作内容绑定到登陆者

2020-08-30 17:17  lzhshn  阅读(315)  评论(0编辑  收藏  举报

【1】登录后的界面

假设有个叫login_ok.html的页面,当成功注册和成功登录后,会跳转到这个页面。

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    {% if user.is_authenticated %}
        <p>hello,{{user.username}}</p>
        <p>login success,so,you can see the page!</p>
        <span><a href="{% url 'simplesite:add' %}">add student</a><a href="{% url 'account:logout' %}">logout</a></span>
    {% else %}
        <p>please login first:</p>
        <p><a href="{% url 'account:login' %}">login</a></p>
    {% endif %}

</body>
</html>

  

这里先判断有没有user登录,如果有,则显示的登陆者信息,及相关操作的入口:添加学生(add student),注销(logout);

如果没有登录的,则提示进行登录(login)。

 

【2】假设登录后,录入一个学生信息,然后提交,最后可以看到所有的学生信息。

@login_required
def add_student(request):
    current_user = request.user
    if request.method == 'POST':
        form = StudentForm(request.POST)
        if form.is_valid():
            new_student_info = form.save(commit=False)
            new_student_info.user = current_user
            new_student_info.master = current_user.username
            new_student_info.save()
            return HttpResponseRedirect(reverse('simplesite:info'))


    else:
        form = StudentForm
        context = {'form': form}
        return render(request, 'add_student.html', context)

@login_required
def show_student_info(request):
    all_student = StudentInfo.objects.order_by('-add_time')
    context = {'all_student':all_student} 

  return render(request, 'student_info.html', context)

  

在录入学生信息时,通过:current_user = request.user获取当前的登录用户,我们假定这个身份就是班主任。

然后根据之前定义的学生关系,让学生和这个班主任建立联系,并将学生的master属性,设置为当前user的username。然后进行存储,并跳转到显示学生信息的页面。

 

在录入学生和查看学生信息的views函数前,都使用了@login_required装饰器,这是django已经为我们写好的轮子,直接拿来使用,然后配置一下你所设置的登录url即可。

在setting.py里添加一条:LOGIN_URL = '/ac/login'即可。