关于通过ModelForm进行前端数据校验的两种方法

150 阅读1分钟
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError


class AdvancednumForm(forms.ModelForm):
    # 添加校验方式1
    # 注意,此处的PhoneNumber就是下面fields中的PhoneNumber,否则会在页面多添加字段
    PhoneNumber = forms.CharField(
        label="号码", # 此处就的前端的label标签
        # 此处需要上面的引入,通过正则表达式进行校验
        validators=[RegexValidator(r'^1[3-9]\d{9}$', "请输入真实号码",)],
    )

    class Meta:
        model = models.AdvancedNum
        fields = ["PhoneNumber", "Price", "Level", "Status"]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        for name, field in self.fields.items():
            field.widget.attrs = {"class": "form-control", "placeholder": field.label}

    # 校验方式2:钩子方法
    def clean_PhoneNumber(self):  # 上面有fields字段,就会自动生成clean_字段名(这里为PhoneNumber)的方法
        txt_num = self.cleaned_data["PhoneNumber"]

        # 在添加时判断该号码是否存在
        whe_exists = models.AdvancedNum.objects.filter(PhoneNumber=txt_num).exists()
        if whe_exists:
            raise ValidationError("此手机号已存在")
        # 关于钩子方法校验号码长度
        # if len(txt_num) != 11:
        #     # 验证不通过
        #     raise ValidationError("长度不够,请重新输入")
        # 通过,返回输入值
        return txt_num
```
```