Considerations regarding model’s error_messages
¶
Error messages defined at the form field
level or at the form Meta level always take precedence over the error messages defined at the model field
level.
Error messages defined on model fields
are only used when the ValidationError
is raised during the model validation step and no corresponding error messages are defined at the form level.
# 您可以通過將NON_FIELD_ERRORS鍵添加到ModelForm的內部Meta類的error_messages字典中來覆蓋模型驗證所引起的NON_FIELD_ERRORS錯誤消息:
You can override the error messages from NON_FIELD_ERRORS
raised by model validation by adding the NON_FIELD_ERRORS
key to the error_messages
dictionary of the ModelForm
’s inner Meta
class:
from django.core.exceptions import NON_FIELD_ERRORS from django.forms import ModelForm class ArticleForm(ModelForm): class Meta: error_messages = { NON_FIELD_ERRORS: { 'unique_together': "%(model_name)s's %(field_labels)s are not unique.", } }
對於常見序列化error_message可以使用以下:
例子IntegerField
class ShopCartSerializer(serializers.Serializer):
nums = serializers.IntegerField(required=True,label='數量',min_value=1,error_messages={
"min_value":"商品數量不能小於一","required":"請選擇購物數量"})
不同類型的字段有不同的 error_messages 定義
查看rest framework 源碼 看到最基礎的field 中定義了兩個error_messages
class Field(object):
_creation_counter = 0
default_error_messages = {
'required': _('This field is required.'),
'null': _('This field may not be null.')
}
不同字段中還定義了不同的error_messages IntegerField 中增加了
class IntegerField(Field):
default_error_messages = {
'invalid': _('A valid integer is required.'),
'max_value': _('Ensure this value is less than or equal to {max_value}.'),
'min_value': _('Ensure this value is greater than or equal to {min_value}.'),
'max_string_length': _('String value too large.')
}
這里面的字段我們可以自定義返回前端
CharField
class CharField(Field):
default_error_messages = {
'invalid': _('Not a valid string.'),
'blank': _('This field may not be blank.'),
'max_length': _('Ensure this field has no more than {max_length} characters.'),
'min_length': _('Ensure this field has at least {min_length} characters.')
}
例子:
code = serializers.CharField(required=True, write_only=True, max_length=6, min_length=6,
error_messages={
"blank": "請輸入驗證碼",
"required": "請輸入驗證碼",
"max_length": "驗證碼格式錯誤",
"min_length": "驗證碼格式錯誤"
},
help_text="驗證碼")
外鍵字段
class PrimaryKeyRelatedField(RelatedField):
default_error_messages = {
'required': _('This field is required.'),
'does_not_exist': _('Invalid pk "{pk_value}" - object does not exist.'),
'incorrect_type': _('Incorrect type. Expected pk value, received {data_type}.'),
}
當然也可以使用validator:
project_name = serializers.CharField(max_length=50, required=True,
validators=[UniqueValidator(queryset=models.ProjectInformation.objects.all())]
)
還可以再extra_kwargs里使用:
class Meta:
model = models.JenkinsServices
fields = "__all__"
validators = [
UniqueTogetherValidator(
queryset=models.JenkinsServices.objects.all(),
fields=['project_id', 'service_name']
)
]
extra_kwargs = {"service_name": {"error_messages": {"required": "Give your service_name"}}}
其次模型層也可以限制:
from django.core.validators import (MaxValueValidator, MinValueValidator,
MinLengthValidator,MaxLengthValidator)
class JenkinsServices(models.Model):
project_id = models.IntegerField(
validators=[MaxValueValidator(1000), MinValueValidator(1)])
service_name = models.CharField(max_length=100, null=False)