Django之Form组件验证

今天来谈谈Django的Form组件操作

Django中的Form一般有两种功能


 

  ·输入html
  ·验证用户输入

Form验证流程


 

  ·定义规则(是一个类)
     ·前端把数据提交过来
  ·匹配规则
  ·判断提交过来的数据是否符合定义的规则
  ·如果匹配返回True,否则返回errors,可以把这个errors返回给前端,让前端显示到指定位置(比如用户名没填写,验证码没填写)

匹配规则


views.py

from django import forms
from django.forms import widgets   #Forms里的插件 里面有css插件和其他的插件
from django.forms import fields #CharField、EmailField等都在field里,而field在fdjango.forms里,所以以后使用fields.CharField()替代forms.CharField
class FM(forms.Form):
    user=fields.CharField(error_messages={'required':"用户名不能为空"},
                         widget=widgets.Textarea(attrs={"class":"c1"}))   #为User添加个“class='c1'”样式
    pwd=fields.CharField(
                max_length=12,
                min_length=6,
                error_messages={'required':"密码不能为空",
                                'min_length':'密码长度不能小于6位',
                                'max_length':'密码长度不能大于12位'},
                widget=widgets.PasswordInput(attrs={'class':'c2'}))
    email=fields.EmailField(error_messages={'required':"邮箱不能为空",'invalid':'邮箱格式错误'})

注意:规则中的字段名必须得等于html中name的值

Form表单方法


 

views.py

from app_01 import models
def fm(request):
    if request.method=="GET":
        obj=FM()
        return render(request,'fm.html',{'obj':obj})
    elif request.method=="POST":
        #获取用户所有数据
        #每条数据请求的验证
        #成功:获取所有的正确信息
        #失败:显示错误信息
        obj=FM(request.POST)
        r1=obj.is_valid()
        if r1:
            # models.UserInfo.object.create(obj.cleaned_data)   对其进行注册
            print(obj.cleaned_data)
        else:
            return render(request,'fm.html',{'obj':obj})
        return render(request,'fm.html')

方法:

obj.is_valid():验证表单数据是否合法

obj.errors:表单的错误以字典形式返回(如果有多个错误,可以循环这个字典,然后传给前端)

obj.cleaned_data:获取表单数据

obj.as_p:将表单渲染成P标签

示例:实现Form组件验证


前端html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/fm/" method="post">
        <p><input type="text" name="user" />{{ obj.errors.user.0 }}</p>
        <p><input type="text" name="pwd" />{{ obj.errors.pwd.0 }}</p>
        <p><input type="email" name="email" />{{ obj.errors.email.0 }}</p>
        <input type="submit" value="提交" />
    </form>
</body>
</html>

views.py

from django import forms
class FM(forms.Form):
    user=forms.CharField(error_messages={'required':"用户名不能为空"})
    pwd=forms.CharField(
                max_length=12,
                min_length=6,
                error_messages={'required':"密码不能为空",
                                'min_length':'密码长度不能小于6位',
                                'max_length':'密码长度不能大于12位'})
    email=forms.EmailField(error_messages={'required':"邮箱不能为空",'invalid':'邮箱格式错误'})

from app_01 import models
def fm(request):
    if request.method=="GET":
        obj=FM()
        return render(request,'fm.html',{'obj':obj})
    elif request.method=="POST":
        #获取用户所有数据
        #每条数据请求的验证
        #成功:获取所有的正确信息
        #失败:显示错误信息
        obj=FM(request.POST)  #request.POST是获取用户前端输入内容,例如:<QueryDict: {'pwd': ['1111'], 'user': ['11111'], 'undefined': ['提交']}>
        r1=obj.is_valid()   #判断用户输入是否符合上面LoginForm定义的规则,如果符合返回True,否则范围False(符合规则就是 比如:不能为空,最大输入字符为10个等等)
        if r1:
            # models.UserInfo.object.create(obj.cleaned_data)   对其进行注册
            print(obj.cleaned_data)   #obj.clean()方法是获取用户输入内容(例如:{'pwd': '1111', 'user': '11111'})
        else:
            print(obj.errors)    #obj.errors是获取用户输入的错误信息,比如说规则里定义了不能为空,但是用户输入为空了,就会报错(例如:<li>pwd<ul class="errorlist"><li>This field is required.</li></ul>)
            return render(request,'fm.html',{'obj':obj})
        return render(request,'fm.html')    

在高级点,修改下前端的html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/fm/" method="post">
        <p>{{ obj.user }} {{ obj.errors.user.0 }}</p>
        <p>{{ obj.pwd }} {{ obj.errors.pwd.0 }}</p>
        <p>{{ obj.email }} {{ obj.errors.email.0 }}</p>
        <input type="submit" value="提交" />
    </form>
</body>
</html>

因为Django里没有手机验证,所以基于正则表达式的手机验证如下

import re
from django import forms
from django.core.exceptions import ValidationError


def mobile_validate(value):
    mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
    if not mobile_re.match(value):
        raise ValidationError('手机号码格式错误')


class PublishForm(forms.Form):

    user_type_choice = (
        (0, u'普通用户'),
        (1, u'高级用户'),
    )

    user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,
                                                                  attrs={'class': "form-control"}))

    title = forms.CharField(max_length=20,
                            min_length=5,
                            error_messages={'required': u'标题不能为空',
                                            'min_length': u'标题最少为5个字符',
                                            'max_length': u'标题最多为20个字符'},
                            widget=forms.TextInput(attrs={'class': "form-control",
                                                          'placeholder': u'标题5-20个字符'}))

    memo = forms.CharField(required=False,
                           max_length=256,
                           widget=forms.widgets.Textarea(attrs={'class': "form-control no-radius", 'placeholder': u'详细描述', 'rows': 3}))

    phone = forms.CharField(validators=[mobile_validate, ],
                            error_messages={'required': u'手机不能为空'},
                            widget=forms.TextInput(attrs={'class': "form-control",
                                                          'placeholder': u'手机号码'}))

    email = forms.EmailField(required=False,
                            error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},
                            widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))
posted @ 2018-05-30 20:10  追风的小蚂蚁  阅读(286)  评论(0编辑  收藏  举报