• 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'
    

      

     

  • 相关阅读:
    【更新】Java发送邮件:个人邮箱(QQ & 网易163)+企业邮箱+Android
    git pull 出现 WARNING: POSSIBLE DNS SPOOFING DETECTED!
    Redis解决“重试次数”场景的实现思路
    IDEA更改JavaScript版本
    npm与yarn命令
    SpringBoot+Vue前后端分离项目,maven package自动打包整合
    Vue(九)使用Ant Design入门——环境搭建
    Git常用命令
    Vue(八)全局变量和全局方法
    笔记本电池怎样使用问题
  • 原文地址:https://www.cnblogs.com/liulilitoday/p/13652831.html
Copyright © 2020-2023  润新知