6-4-5 django在线教育平台----用form实现登录

一、用类实现登录

1 、之前实现的登录是基于函数实现的,现在用类的方式实现

按住Ctrl并同时点击View,查看里面的方法,重写get()、post()方法,只需要将原来的函数写成类

这里写图片描述

这里写图片描述

如果是GET直接调用get()方法,所以不需要再进行判断是GET还是POST

2、url配置,这里调用as_view方法

这里写图片描述

3、django提供了表单类Form,直接使用现有的轮子更方便,Form可以将用户提交的表单进行一部分预处理,比如进行一些判断,验证等
关于django form介绍可参考:http://www.h5w3.com/doc/django-docs-1.9-en/topics/forms/index.html

4、新建forms.py文件,编写forms逻辑

这里写图片描述

继承Form,对username和password进行验证,这里的username和password和前端input便签中的是相同的,名称必须一致
这里写图片描述

这里写图片描述

5、编写views逻辑,首先要实例化LoginView类,如果使用POST请求提交表单,views会使用来自请求的数据,login_form = NameForm(request.POST)会将数据和表单绑定起来,那么login_form中 存放着数据,如果表单提交的数据通过验证,is_valid()方法返回Ture

这里写图片描述

参考:http://www.h5w3.com/doc/django-docs-1.9-en/topics/forms/index.html

这里写图片描述

打断点调试,在不输入用户名只输入密码的情况下调试,错误提示如下图,username是必填字段

这里写图片描述

在输入正确用户名,密码少于五位的情况下调试,错误提示密码至少是五位

这里写图片描述

二、将错误提示显示在前端

1、当用户名和密码错误时,需要将提示信息显示在前端,并将错误的方框选中,只需要将login_form的信息传递到模板中显示,效果如下图

这里写图片描述

2、编写views,数据通过render()中的login_form传递到模板中

这里写图片描述

2、模板中当用户名和密码不正确时,选中方框,并通过login_form将错误信息显示在前端

这里写图片描述

3、测试

当不输入用户名和密码的情况下,效果显示如图,显示错误信息过多,破坏了前端样式,我们将遍历中的key去掉,再刷新

这里写图片描述

这里写图片描述

输入正确用户名,不输入密码的情况下

这里写图片描述

总结:
1、继承View,用类的方式写了views逻辑,重写了View中的get()、post()方法
2、配置url时,用到了继承自View的as_view()方法
3、新建了forms文件,利用Form类验证前端传过来的数据的有效性
4、在views中实例化新建的LoginForm类数据通过request.POST参数传递到views中,并使用了is_valid()方法判断数据的合法性

views.py


#  _*_ coding:utf-8 _*_
from django.shortcuts import render
from django.contrib.auth import authenticate, login
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from django.views.generic.base import View

from .models import UserProfile
from .forms import LoginForm


class CustomBackend(ModelBackend):
    def authenticate(self, username=None, password=None, **kwargs):
        try:
            user = UserProfile.objects.get(Q(username=username) | Q(email=username))     # 将用户名和邮箱与数据库里的用户名和邮箱比较
            if user.check_password(password):             # 密码加密后与数据库里的密码比较
                return user
        except Exception as e:
            return None


class LoginView(View):
    def get(self, request):
        return render(request, 'login.html', {})

    def post(self, request):
        login_form = LoginForm(request.POST)
        if login_form.is_valid():                         # 验证有效性,和forms中的验证相关
            user_name = request.POST.get("username", "")  # 取出前端传过来的username
            pass_word = request.POST.get("password", "")  # 取出前端传过来的password
            user = authenticate(username=user_name, password=pass_word)  # 验证username,password是否正确,和数据库比对
            if user is not None:                         # 如果验证不通过,返回None
                login(request, user)                     # 登录
                return render(request, "index.html")     # 暂时返回首页,首页登录部分变成个人中心
            else:
                return render(request, 'login.html', {"msg": "用户名或密码错误!"})  # 登录不成功还是返回登录页
        else:
            return render(request, "login.html", {"login_form": login_form})


# Create your views here.
# def user_login(request):
#     if request.method == "POST":
#
#         user_name = request.POST.get("username", "")  # 取出前端传过来的username
#         pass_word = request.POST.get("password", "")  # 取出前端传过来的password
#         user = authenticate(username=user_name, password=pass_word)      # 验证username,password是否正确
#         if user is not None:                         # 如果验证不通过,返回None
#             login(request, user)                     # 登录
#             return render(request, "index.html")     # 暂时返回首页,首页登录部分变成个人中心
#         else:
#             return render(request, 'login.html', {"msg": "用户名或密码错误!"})  # 登录不成功还是返回登录页
#
#     elif request.method == "GET":
#         return render(request, 'login.html', {})

猜你喜欢

转载自blog.csdn.net/f1ngf1ngy1ng/article/details/80932261