django的form表单验证

通过HTML向后台提交数据时,需要对提交的数据进行验证,比如:长度,手机号是否是11位等等各种验证条件,这时就可以使用django提供的form进行验证
在app的根目录创建forms.py文件

forms.py
from django import forms
from django.core.exceptions import ValidationError #抛出异常用的
from user import models

# 公共验证器
# 第一个进行的验证方式
def test_phone(value):
    if len(value)!=11:
        raise ValidationError('手机格式不正确')
    return value


class ArticleForm(forms.Form):
    phone = forms.CharField(required=True,  # 是否必填
                            validators=[test_phone],  # 自定义验证方式,例如:公共验证方法  最先执行
                            error_messages={  # 错误信息提示
                                'required': '必填',
                                'max_length': '最大18个字符'

                            })

    title = forms.CharField(required=True,#是否必填
                            max_length=10, #最大长度
                            min_length=5,# 最小长度
                            strip=False,# 是否去掉用户输入的空格  默认是True
                            # empty_value = 'TitleInit', #默认值,当前端不传递时接收到的信息
                            error_messages={ #错误信息提示
                                'required':'必填',
                                'max_length': '最大18个字符',
                                'min_length': '最小5个字符'

                            })

# forms中存在钩子函数 clean
    # 第三步:全部数据进行验证
    # 验证手机号特殊的逻辑
    def clean(self):
        # 通过self.cleaned_data 可以获取到所有数据
        print('clean',1)
        return self.cleaned_data

    # 针对个别字段进行验证
    # 第二步:针对个别字段进行验证
    def clean_phone(self):
        print('clean-phone', 2)
        return self.cleaned_data.get('phone')



'''
Form和Model结合,能够省略定义Form定义字段。 共用Model
'''
def test_name(value):
    if value =='dxs':
        raise ValidationError('姓名不存在')
    else:
        return value

class StudentForm(forms.ModelForm):
    # 当你觉得model写的验证规则不符合你的要求时,可以像forms.Form一样进行验证
    name = forms.CharField(validators=[test_name])
    class Meta:
        model = models.Student  #创建类变量和model建立映射关系
        # fields = '__all__'  #验证全部字段
        # fields = ['name']   #显示指定列验证  只有指定的验证字段才会出现在cleaned_data中
        exclude = ['name']  #排除了就不会出现在cleaned_data中
        # 在使用forms.ModelForm后,一样也可以像forms.Form一样自己定义字段定义
        # 自己在form中定义的字段,在数据库时会出问题,因为数据库没这个字段,所以不建议这样使用
        # 或者自己要处理下返回的cleaned_data
        # 这种常用于,认为model写的验证不够完美,可以重新定义这个字段的验证规则
        # #     clean的原则和forms.Form相同
        def clean(self):
            if self.cleaned_data.get('name') =='shz':
                raise ValidationError('姓名是射手座')
            else:
                return self.cleaned_data

        # 单个字段验证,必须保证在form中有写这个字段
        def clean_name(self):
            if self.cleaned_data.get('name') == 'nhy':
                raise ValidationError('姓名是nhy')
            else:
                return self.cleaned_data.get('name')

 

post.html

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

    {% csrf_token %}

    <h1>写文章的</h1>
    <div>
            title:<input type="text" name="title">

    </div>
    <div>
            phone:<input type="text" name="phone">

    </div>

    <div>
        <select name="category">
            {% for category in categories %}
            <option value="{{ category.id }}">{{ category.name }}</option>
            {% endfor %}
        </select>
    </div>

    <div>
            <input type="submit" value="提交">

    </div>

</form>


</body>
</html>

 

student.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/student" method="post">

    {% csrf_token %}

    <h1>创建学生</h1>
    <div>
            name:<input type="text" name="name">
    </div>
    <div>
        age:<input type="text" name="age">
    </div>

    <div>


    </div>

    <div>
            <input type="submit" value="提交">

    </div>

</form>


</body>
</html>

 

views.py

 

def article(request):
    if request.method=='GET':
        return render(request,'post.html')
    else:
        # 实例化form验证器,接收post传过来的数据
        articleObj = ArticleForm(request.POST)
        # 判断当前写好的验证器是否验证通过  返回True或false
        f = articleObj.is_valid()
        if f:
            # 验证通过的数据,存在了一个叫cleaned_data
            # 验证通过的字段会都在cleaned_data中,是个dict
            print('articleObj.cleaned_data',articleObj.cleaned_data)
            msg = '成功'
        #     验证通过后,可以做参数据库的操作
        else:
            print('is_valid',f)
            # 拿到错误信息
            print('articleObj.errors',articleObj.errors)
            # 通过dict方式取信息
            print('articleObj.errors',articleObj.errors.get_json_data())
            # msg = articleObj.errors.get_json_data().get('title')[0].get('message')
        # return HttpResponse(msg)
        return HttpResponse(articleObj.errors)


def student(requests):
    if requests.method=='GET':
        return render(requests,'student.html')
    else:
        studentObj = StudentForm(requests.POST)
        f = studentObj.is_valid()
        if f:
            print('cleaned data',studentObj.cleaned_data)
        else:
            print('error',studentObj.errors.get_json_data())
        return HttpResponse('ok')

 

models.py

class Student(models.Model):
    name = models.CharField(verbose_name='老师名字',max_length=50)
    age = models.IntegerField(verbose_name='年龄')
    class Meta:
        db_table = 'student'

  

 

 

posted @ 2020-09-11 17:19  LDM_datos  Views(242)  Comments(0Edit  收藏  举报