美文网首页
8.写一个表单验证

8.写一个表单验证

作者: 何阿驼 | 来源:发表于2018-07-12 15:52 被阅读0次

    在数据库创建的时候,我们要创建一些用户,为了统一管理,我们将创建一个用户类继承自Django自带的用户类,并对其进行权限的分类,

    1530991530327.png 1530991566071.png

    可以看出AbstractUser就是Django自带的用户类。

    1530991620542.png

    并且他自带了很多需要自带的字段,我们继承之后只要外加自己想要加入的字段就可以

    登录

    首先,我们做一个登录的表单,我们拿之前自己创建的管理员用户去登录。

    1.流程

    1530991791188.png

    点击登录

    1530991805119.png

    输入账号密码

    点击登录

    登录成功之后跳转到首页面

    1531059779150.png
    /views.py
    class Login_View(View):
        def get(self,request):
            #因为是登录模块的表单验证,所以如果是get请求,则账号密码可能会暴露在url地址栏中,所以我们是
            #拒绝这样的请求的,如果他是get请求,则直接返回空页面给用户
            return render(request,'login.html')
        def post(self,request):
            # 如果是post请求,则1.我们要拿到账号和密码 2.检查账号密码是否符合要求。3.符合要求之后是否存在于数据库中
            # 4.如果存在,则跳转至登录界面,并且显示登录成功。如果失败,则清空输入框跳转至登录
            form = loginForm(request.POST)#加载表单也就是post上来的表单数据
            if form.is_valid(): #valid有效的,这里判断form表单是否有效
                username = request.POST['username']
                password = request.POST['password']
                user = authenticate(username=username,password=password)
                if user is not None:
                    if user.is_active:
                        login(request,user)
                    else:
                        return render(request,'login.html',{'message':'账号未激活'})
                else:
                    return render(request,'login.html',{'message':'不好意思,不存在这个账号'})
            else:
                return render(request,'login.html',{'form_message':form})
    
    /urls.py
    path('login/',Login_View.as_view(),name = 'login'),
    

    form表单

    我们会单独写一个form.py文件来专门写form。这个form里面写了对提交数据的一些约束

    1531004133609.png

    这些约束其实大部分就是字段的内容。

    另外对于我们传向模板的参数中,有一个form

    这个form自带了一些判断。

    比如我们可以用来

    <div class="form-group marb20 {% if form_message.username.errors %} errorput{% endif %}">
        <label>用&nbsp;户&nbsp;名</label>
        <input name="username" id="account_l" type="text" placeholder="手机号/邮箱" />
    </div>
    

    form_message.username.errors

    如果post传递的username为空,则会出现errorput的错误样式

    1531002971158.png
    <div class="error btns login-form-tips" id="jsLoginTips">
    {% for key, error in form_message.errors.items %}
        {{ error }}
    {% endfor %}
        {{ message }}
    </div>
    

    同样可以通过这个方法来取值。显示错误信息

    1531002981757.png

    使用邮箱登录

    1.测试数据

    1531003521859.png

    2.流程

    使用django的指定认证后端Django AUTHENTICATION_BACKENDS

    使用Q操作查询数据库中的内容

    查找username=username 或者email=username

    如果存在则返回user

    什么是认证后端

    Django维护一个”authentication backends”的列表用来测试认证。当调用 django.contrib.auth.authenticate() — Django将尝试所有的认证后端。如果第一个认证方法失败了,Django将会继续尝试第二个,直到所有的都被尝试过。 认证后端的列表在 AUTHENTICATION_BACKENDS 设置。内容应该是包含Python路径的元组。默认情况下, AUTHENTICATION_BACKENDS 设置为 (‘django.contrib.auth.backends.ModelBackend’,),这是检测Django用户数据库的基本认证方案。 按照 AUTHENTICATION_BACKENDS 的排列顺序,如果同样的用户名和密码在第一次就匹配了,那么Django将停止处理后面的东西。

    1.在setting.py中设置内容

    AUTHENTICATION_BACKENDS=(
        'users.views.CustomBackend',
    )
    

    2.在view.py里面编写内容

    1531059767832.png
    from django.db.models import Q
    
    1531003811850.png

    这里重写了authenticate这个函数。方法就是因为我们需要根据邮箱来登录验证。所以当我们输入任何内容取认证的时候,他都会来到这个方法中取验证。首先验证username,发现错误之后,因为是Q函数,所以他会取调用email=username。如果通过则会使用user.check_password(password)验证莫玛。成功则返回user

    这样一个登录的表单验证就做好了,接下来是登出

    1531004540151.png 1531004551287.png

    注册

    1.流程

    1531057567569.png

    点击注册,跳转到注册界面

    1531057600925.png

    这是一个post请求,同时还附带了一个get请求。

    验证码

    其中验证码的图片是一个get请求。我们要使用到另外一个插件库

    django-simple-captcha

    1531058101261.png 1531058131148.png 1531058185155.png 1531058382011.png 1531058392611.png 1531059032098.png 1531059046584.png

    账户验证激活

    当注册成功后,会自动登录。但是账号未被激活,这个时候我们需要发送邮箱来激活这个账号

    1.首先我们需要在setting.py中设置

    1531059255568.png

    email_host_user 为你的QQ邮箱账号

    email_host_password为你的授权的密码

    email_from 为你的QQ邮箱账号

    1531059407330.png 1531059423135.png

    写一个专门生成随机字符串的方法来提供调用

    紧接着写一个用来判断注册链接和忘记密码链接的方法

    这些内容写在一个utile文件夹下,专门用来存放脚本的文件夹

    另外,我们还需要在写一个方法用来激活这些内容

    使用的是get请求

    1531059608246.png

    这是激活

    1531059643782.png

    这是忘记密码和更新密码

    1531059664670.png 1531059676118.png
    1531059684295.png

    modelform

    一般的form表单是这样的,引用的是django.form.Form

    1531064511412.png

    但是一旦需要验证的字段过多就会出现不断重写Field

    做普通的form表单
    可以对form表单进行一定的限制,比如required=TRUE 表示该内容必须不为空,否则会报错(相当于blank=true,null=true),
    min_length = 2表示最小长度为2,max_length =20表示最大长度为20
    缺点:代码的重复性过高

    这个时候出现出现了modelform

    1531065060218.png

    相关文章

      网友评论

          本文标题:8.写一个表单验证

          本文链接:https://www.haomeiwen.com/subject/gwlrpftx.html