#coding=utf-8
from rest_framework import fields
def dump_serializer_errors(serializer):
error_messages = {
u'blank': u'此字段不能为空',
u'required': u'此字段必填',
u'max_length':u'此字段不超过%d个字符',
u'min_length':u'此字段不少于%d个字符',
u'null': u'该字段不能为空' # This field may not be null
}
field_error_messages = {
fields.BooleanField:{
u'invalid': u'此字段不是一个合法的布尔值'
},
fields.CharField: {
u'invalid': u'此字段不是一个合法的字符串'
},
fields.NullBooleanField: {
u'invalid': u'此字段不是一个合法的布尔值'
},
fields.EmailField: {
u'invalid': u'邮箱格式不正确'
},
fields.RegexField: {
u'invalid': u'此字段没有匹配的一个必要的模板'
},
fields.SlugField: {
u'invalid': u'此字段不是一个合法的slug,应该由字母,数字,下划线,连字符组成',
u'invalid_unicode': u'此字段不是一个合法的slug,应该由unicode字母,数字,下划线,连字符组成'
},
fields.URLField: {
u'invalid': u'此字段不是一个合法的URL'
},
fields.UUIDField: {
u'invalid': u'此字段不是一个合法的UUID'
},
fields.IPAddressField: {
u'invalid': u'此字段不是一个合法的IPv4或者IPv6地址'
},
fields.IntegerField: {
u'invalid': u'此字段不是一个合法的整数',
u'max_value': u'此字段的数值要小于等于%d',
u'min_value': u'此字段的数值要大于等于%d',
u'max_string_length': u'此字段长度超过1000',
},
fields.FloatField: {
u'invalid': u'此字段不是一个合法的浮点数',
u'max_value': u'此字段的数值要小于等于%d',
u'min_value': u'此字段的数值要大于等于%d',
u'max_string_length': u'此字段长度超过1000',
},
fields.DecimalField: {
u'invalid': u'此字段不是一个合法的数字',
u'max_value': u'此字段的数值要小于等于%d',
u'min_value': u'此字段的数值要大于等于%d',
u'max_digits': u'此字段的数值不超过%d位',
u'max_decimal_places': u'此字段十进制位不超过%d',
u'max_whole_digits': u'此字段小数点前的数字不超过%d。',
u'max_string_length': u'此字段长度超过1000',
},
fields.DateTimeField: {
u'invalid': u'日期时间格式不合法',
u'date': u'不能只输入日期,应输入日期和时间',
u'make_aware': u'时区%d不合法',
u'overflow': u'日期时间超出范围',
},
fields.DateField: {
u'invalid': u'日期格式不合法',
u'date': u'应输入日期,不能输入日期和时间',
},
fields.TimeField: {
u'invalid': u'时间格式不合法',
},
fields.DurationField: {
u'invalid': u'时间段格式不合法,应该用格式:%d',
},
fields.ChoiceField: {
u'invalid_choice': u'此字段不是一个合法的选项',
},
fields.MultipleChoiceField: {
u'invalid_choice': u'此字段不是一个合法的选项',
u'not_a_list': u'应输入数组(list)格式',
u'empty': u'此选项不能为空',
},
fields.FilePathField: {
u'invalid_choice': u'此字段不是一个合法的路径',
},
fields.FileField: {
u'required': u'没有提交文件',
u'invalid': u'提交的不是文件,请检查表单的编码类型',
u'no_name': u'没有文件名',
u'empty': u'提交的是一个空文件',
u'max_length': u'文件内容要小于%d个字符',
},
fields.ImageField: {
u'invalid_image': u'提交的不是图片文件或者图片文件损坏,请提交一个合法的图片文件',
},
fields.ListField: {
u'not_a_list': u'此字段应传入数组(list)类型',
u'empty': u'传入的list不能为空',
u'min_length': u'该字段至少要%d个元素',
u'max_length': u'该字段最多能有%d个元素',
},
fields.DictField: {
u'not_a_dict': u'此字段应传入字典(dict)类型',
},
fields.JSONField: {
u'invalid': u'此字段不是一个合法的JSON类型'
},
fields.ModelField: {
u'max_length': u'此字段长度要小于等于%d个字符'
}
}
result = [u'数据错误
', ]
for i in range(0, len(serializer.errors.keys())):
k = serializer.errors.keys()[i]
v = serializer.errors.values()[i]
field = serializer.fields.get(k)
label = field.label
if label:
label += ' - '
else:
label = ''
error_detail = v[0]
try:
msg = field_error_messages[type(field)][error_detail.code]
if type(field) == fields.IntegerField or type(field) == fields.FloatField:
if error_detail.code == u'max_value':
msg = msg % field.max_value
if error_detail.code == u'min_value':
msg = msg % field.min_value
if type(field) == fields.DecimalField:
if error_detail.code == u'max_value':
msg = msg % field.max_value
if error_detail.code == u'min_value':
msg = msg % field.min_value
if error_detail.code == u'max_digits':
msg = msg % field.max_digits
if error_detail.code == u'max_decimal_places':
msg = msg % field.decimal_places
if error_detail.code == u'max_whole_digits':
msg = msg % field.max_whole_digits
if type(field) == fields.DateTimeField:
if error_detail.code == u'make_aware':
msg = msg % field.timezone
if type(field) == fields.DurationField:
if error_detail.code == u'invalid':
msg = msg % u'[DD] [HH:[MM:]]ss[.uuuuuu]'
if type(field) == fields.DateTimeField:
if error_detail.code == u'make_aware':
msg = msg % field.timezone
if type(field) == fields.ListField:
if error_detail.code == u'min_length':
msg = msg % field.min_length
if error_detail.code == u'max_length':
msg = msg % field.max_length
if type(field) == fields.ModelField:
if error_detail.code == u'max_length':
msg = msg % field.max_length
except:
try:
msg = error_messages[error_detail.code]
if error_detail.code == u'max_length':
msg = msg % field.max_length
if error_detail.code == u'min_length':
msg = msg % field.min_length
except:
msg = unicode(error_detail)
msg = label + msg
result.append(msg)
return u'
'.join(result)