Django12-ModelForm中建立局部鉤子和全局鉤子

1、局部鉤子

命名規則爲clean_對象名稱,例如上面定義了username、pwd對象,那麼能夠定義clean_username、clean_pwd的局部鉤子進行規則校驗前端

一、例子:定義一個手機號校驗的局部鉤子django

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

二、例子:定義局部鉤子,判斷部門名稱是否已存在ui

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 ValidationErrorspa


拋出異常時使用ValidationError,則錯誤信息在__all__字典中,模板中經過{{form_obj.non_field_error.0}}獲取錯誤信息
raise ValidationError('部門名稱已存在')code

若是使用self.add_error方法,則是給指定字段添加錯誤信息
self.add_error('depart_name', '部門名稱已存在')orm

2、全局鉤子

編寫全局鉤子預留的clean方法,能夠獲取到多個字段並進行校驗對象

一、例子:定義一個校驗2次輸入密碼是否一致的全局鉤子blog

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('兩次密碼不一致')

前端能夠經過fomr_obj.errors.__all__ 獲取到內置校驗器的所有錯誤信息

不能經過__all__來調取全局鉤子的錯誤信息,須要經過對象的non_field_errors來獲取錯誤信息列表
{{ form_obj.non_field_errors.0 }}
相關文章
相關標籤/搜索