Django 模型字段自定义验证器返回值未保存
Django model field custom validator returned value not saved
我有以下 phone 数字自定义验证的实现。它正确地进行了验证,但返回的值(格式化的)没有保存在模型实例中。我不使用自定义表单,数据是从管理面板输入的。
自定义验证器
def phone_number_validator(value):
if value:
value = value.strip()
value = value.replace(' ', '')
digits = []
non_digits = []
for c in value:
if c.isdigit():
digits.append(c)
else:
non_digits.append(c)
if len(non_digits):
raise ValidationError('Only numbers and spaces are allowed for this field.')
elif len(digits) < 10 or len(digits) > 10:
raise ValidationError('Phone number should be exactly 10 digits.')
elif (not value.startswith('07')) and (not value.startswith('0')):
raise ValidationError('Invalid phone number.')
if value.startswith('07'): # mobile number
value = f'{value[0:3]} {value[3:6]} {value[6:]}'
elif value.startswith('0'): # landline
value = f'{value[0:3]} {value[3:4]} {value[4:7]} {value[7:]}'
print(value) #### here the correct format is displayed
return value
models.py
hotline = models.CharField(max_length=PHONE_NUMBER_LENGTH, validators=[phone_number_validator])
已回答此问题 (and from the docs)。
如果您想使用 validate_or_process
函数,我有自己的方法 question
验证器的目的只是根据一组标准检查值。不是修改值的意思。
我有以下 phone 数字自定义验证的实现。它正确地进行了验证,但返回的值(格式化的)没有保存在模型实例中。我不使用自定义表单,数据是从管理面板输入的。
自定义验证器
def phone_number_validator(value):
if value:
value = value.strip()
value = value.replace(' ', '')
digits = []
non_digits = []
for c in value:
if c.isdigit():
digits.append(c)
else:
non_digits.append(c)
if len(non_digits):
raise ValidationError('Only numbers and spaces are allowed for this field.')
elif len(digits) < 10 or len(digits) > 10:
raise ValidationError('Phone number should be exactly 10 digits.')
elif (not value.startswith('07')) and (not value.startswith('0')):
raise ValidationError('Invalid phone number.')
if value.startswith('07'): # mobile number
value = f'{value[0:3]} {value[3:6]} {value[6:]}'
elif value.startswith('0'): # landline
value = f'{value[0:3]} {value[3:4]} {value[4:7]} {value[7:]}'
print(value) #### here the correct format is displayed
return value
models.py
hotline = models.CharField(max_length=PHONE_NUMBER_LENGTH, validators=[phone_number_validator])
已回答此问题
如果您想使用 validate_or_process
函数,我有自己的方法 question
验证器的目的只是根据一组标准检查值。不是修改值的意思。