Django基础011-form&modelform

1、form

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

#validators的先验证
#第一步验证
def test_phone(value):
    print('test_phone',3)
    if len(value) != 11:
        raise  ValidationError('手机号码格式不正确')#抛出异常
    else:
        return value


class ArticleForm(forms.Form):
    #字段名称要和提交的字段相同
    title = forms.CharField(required=True,#是否必填
                            validators=[test_phone],#自定义校验,公共校验,验证手机,邮箱
                            strip=False,#是否去掉输入的空格,默认为True
                            error_messages={#错误信息提示
                                'required':'必填参数未填',
                                'max_length':'最大10个字符',
                                'min_length':'最小5个字符'
                            })

    # 字段名称要和提交的字段相同
    # title = forms.CharField(required=True,  # 是否必填
    #                         max_length=10,  # 最大字符长度
    #                         min_length=5,  # 最小字符长度
    #                         strip=False,  # 是否去掉输入的空格,默认为True
    #                         error_messages={  # 错误信息提示
    #                             'required': '必填参数未填',
    #                             'max_length': '最大10个字符',
    #                             'min_length': '最小5个字符'
    #                         })

    #form 中的钩子函数
    #第三步对全局进行验证
    def clean(self):
        print('clean',1)
        # 通过 self.cleaned_data获取所有的数据
        return self.cleaned_data

    #针对个别字段进行验证
    #第二步对个别数据进行验证
    def clean_title(self):
        print('clean_title',2)
        #验证手机号是否是我们系统的
        return self.cleaned_data.get('title')
    def clean_content(self):
        pass

views.py中的代码块

from user.forms import ArticleForm,StudentForm
def add_article(request):
    if request.method == 'GET':
        return render(request,'post.html')
    else:
        article_obj = ArticleForm(request.POST)
        f = article_obj.is_valid()#获取校验结果
        if f:
            cleaned_data = article_obj.cleaned_data#校验通过后,结果会存在cleaned_data中,是个dict
            print(cleaned_data)
        else:
            print(article_obj.errors)
        return HttpResponseRedirect(article_obj.errors)

2、modelform

#  model + form
def test_name(value):
    if value == 'dsx':
        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 = ['age']  # 排除了就不会出现在cleaned_data中

    def clean(self):
        if self.cleaned_data.get('name') == 'ssz':
            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')

views.py中的代码块

def student(request):
    if request.method == 'GET':
        return render(request,'student.html')
    else:
        studentObj = StudentForm(request.POST)
        f = studentObj.is_valid()
        if f:
            print('cleaned_data',studentObj.cleaned_data)
        else:
            print('errormsg',studentObj.errors)
        return HttpResponse('ok')

 

上一篇:Django之Model操作


下一篇:Django之ModelForm组件