随笔 - 139  文章 - 0 评论 - 0 阅读 - 33825
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

一、局部钩子

命名规则为clean_对象名称,例如上面定义了username、pwd对象,那么可以定义clean_username、clean_pwd的局部钩子进行规则校验

1、例子:定义一个手机号校验的局部钩子

def clean_phone(self):
    value = self.cleaned_data.get('phone')
    # 没有通过校验规则 抛出ValidationError
    if not re.match(r'^1[3-9]\d{9}$',value):
        raise ValidationError('手机号格式不正确')
    # 通过校验规则  返回当前的值
    return value

2、例子:定义局部钩子,判断部门名称是否已存在

复制代码
from django import forms
from crm import models

class DepartForm(forms.ModelForm):
    class Meta:
        model = models.Depart
        fields = '__all__'
        
        error_messages = {
            'depart_name': {
                'required': '不能为空',
            },
            'depart_desc': {
                'required': '不能为空',
            },
            
        }
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 批量更新class属性
        for field in self.fields.values():
            field.widget.attrs.update({'class': 'form-control'})
    
    # 定义局部钩子,判断部门名称是否已存在
    def clean_depart_name(self):
        depart_name_new = self.cleaned_data.get('depart_name', None)
        if not models.Depart.objects.filter(depart_name=depart_name_new).exists():
            # 注意局部钩子返回的是要校验的这个值,全局钩子返回的是self.cleaned_data
            return depart_name_new
      # self.add_error('depart_name', '部门名称已存在!')
        raise forms.ValidationError('部门名称已存在')
复制代码

配置错误信息时,self.add_error和raise ValidationError这两种方法都可以
导入方法有2种
from django.forms import ValidationError  或者  from django.core.exceptions import ValidationError


抛出异常时使用ValidationError,则错误信息在__all__字典中,模板中通过{{form_obj.non_field_error.0}}获取错误信息
raise ValidationError('部门名称已存在')

如果使用self.add_error方法,则是给指定字段添加错误信息
self.add_error('depart_name', '部门名称已存在')

二、全局钩子

编写全局钩子预留的clean方法,可以获取到多个字段并进行校验

1、例子:定义一个校验2次输入密码是否一致的全局钩子

复制代码
def clean(self):
    pwd = self.cleaned_data.get('pwd')
    re_pwd = self.cleaned_data.get('re_pwd')
    # 通过校验 返回self.cleaned_data
    if pwd == re_pwd:
        return self.cleaned_data
    # 没有通过校验 抛出ValidationError
    # self.add_error('re_pwd','两次密码不一致!')
    raise ValidationError('两次密码不一致')

前端可以通过form_obj.errors.__all__ 获取到内置校验器的全部错误信息

不能通过__all__来调取全局钩子的错误信息,需要通过对象的non_field_errors来获取错误信息列表
{{ form_obj.non_field_errors.0 }}
复制代码

 

posted on   longfei2021  阅读(178)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示