serializer_errors.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. #coding=utf-8
  2. from rest_framework import fields
  3. def dump_serializer_errors(serializer):
  4. error_messages = {
  5. u'blank': u'此字段不能为空',
  6. u'required': u'此字段必填',
  7. u'max_length':u'此字段不超过%d个字符',
  8. u'min_length':u'此字段不少于%d个字符',
  9. u'null': u'该字段不能为空' # This field may not be null
  10. }
  11. field_error_messages = {
  12. fields.BooleanField:{
  13. u'invalid': u'此字段不是一个合法的布尔值'
  14. },
  15. fields.CharField: {
  16. u'invalid': u'此字段不是一个合法的字符串'
  17. },
  18. fields.NullBooleanField: {
  19. u'invalid': u'此字段不是一个合法的布尔值'
  20. },
  21. fields.EmailField: {
  22. u'invalid': u'邮箱格式不正确'
  23. },
  24. fields.RegexField: {
  25. u'invalid': u'此字段没有匹配的一个必要的模板'
  26. },
  27. fields.SlugField: {
  28. u'invalid': u'此字段不是一个合法的slug,应该由字母,数字,下划线,连字符组成',
  29. u'invalid_unicode': u'此字段不是一个合法的slug,应该由unicode字母,数字,下划线,连字符组成'
  30. },
  31. fields.URLField: {
  32. u'invalid': u'此字段不是一个合法的URL'
  33. },
  34. fields.UUIDField: {
  35. u'invalid': u'此字段不是一个合法的UUID'
  36. },
  37. fields.IPAddressField: {
  38. u'invalid': u'此字段不是一个合法的IPv4或者IPv6地址'
  39. },
  40. fields.IntegerField: {
  41. u'invalid': u'此字段不是一个合法的整数',
  42. u'max_value': u'此字段的数值要小于等于%d',
  43. u'min_value': u'此字段的数值要大于等于%d',
  44. u'max_string_length': u'此字段长度超过1000',
  45. },
  46. fields.FloatField: {
  47. u'invalid': u'此字段不是一个合法的浮点数',
  48. u'max_value': u'此字段的数值要小于等于%d',
  49. u'min_value': u'此字段的数值要大于等于%d',
  50. u'max_string_length': u'此字段长度超过1000',
  51. },
  52. fields.DecimalField: {
  53. u'invalid': u'此字段不是一个合法的数字',
  54. u'max_value': u'此字段的数值要小于等于%d',
  55. u'min_value': u'此字段的数值要大于等于%d',
  56. u'max_digits': u'此字段的数值不超过%d位',
  57. u'max_decimal_places': u'此字段十进制位不超过%d',
  58. u'max_whole_digits': u'此字段小数点前的数字不超过%d。',
  59. u'max_string_length': u'此字段长度超过1000',
  60. },
  61. fields.DateTimeField: {
  62. u'invalid': u'日期时间格式不合法',
  63. u'date': u'不能只输入日期,应输入日期和时间',
  64. u'make_aware': u'时区%d不合法',
  65. u'overflow': u'日期时间超出范围',
  66. },
  67. fields.DateField: {
  68. u'invalid': u'日期格式不合法',
  69. u'date': u'应输入日期,不能输入日期和时间',
  70. },
  71. fields.TimeField: {
  72. u'invalid': u'时间格式不合法',
  73. },
  74. fields.DurationField: {
  75. u'invalid': u'时间段格式不合法,应该用格式:%d',
  76. },
  77. fields.ChoiceField: {
  78. u'invalid_choice': u'此字段不是一个合法的选项',
  79. },
  80. fields.MultipleChoiceField: {
  81. u'invalid_choice': u'此字段不是一个合法的选项',
  82. u'not_a_list': u'应输入数组(list)格式',
  83. u'empty': u'此选项不能为空',
  84. },
  85. fields.FilePathField: {
  86. u'invalid_choice': u'此字段不是一个合法的路径',
  87. },
  88. fields.FileField: {
  89. u'required': u'没有提交文件',
  90. u'invalid': u'提交的不是文件,请检查表单的编码类型',
  91. u'no_name': u'没有文件名',
  92. u'empty': u'提交的是一个空文件',
  93. u'max_length': u'文件内容要小于%d个字符',
  94. },
  95. fields.ImageField: {
  96. u'invalid_image': u'提交的不是图片文件或者图片文件损坏,请提交一个合法的图片文件',
  97. },
  98. fields.ListField: {
  99. u'not_a_list': u'此字段应传入数组(list)类型',
  100. u'empty': u'传入的list不能为空',
  101. u'min_length': u'该字段至少要%d个元素',
  102. u'max_length': u'该字段最多能有%d个元素',
  103. },
  104. fields.DictField: {
  105. u'not_a_dict': u'此字段应传入字典(dict)类型',
  106. },
  107. fields.JSONField: {
  108. u'invalid': u'此字段不是一个合法的JSON类型'
  109. },
  110. fields.ModelField: {
  111. u'max_length': u'此字段长度要小于等于%d个字符'
  112. }
  113. }
  114. result = [u'数据错误<br />', ]
  115. for i in range(0, len(serializer.errors.keys())):
  116. k = list(serializer.errors.keys())[i]
  117. v = list(serializer.errors.values())[i]
  118. field = serializer.fields.get(k)
  119. label = field.label
  120. if label:
  121. label += ' - '
  122. else:
  123. label = ''
  124. error_detail = v[0]
  125. try:
  126. msg = field_error_messages[type(field)][error_detail.code]
  127. if type(field) == fields.IntegerField or type(field) == fields.FloatField:
  128. if error_detail.code == u'max_value':
  129. msg = msg % field.max_value
  130. if error_detail.code == u'min_value':
  131. msg = msg % field.min_value
  132. if type(field) == fields.DecimalField:
  133. if error_detail.code == u'max_value':
  134. msg = msg % field.max_value
  135. if error_detail.code == u'min_value':
  136. msg = msg % field.min_value
  137. if error_detail.code == u'max_digits':
  138. msg = msg % field.max_digits
  139. if error_detail.code == u'max_decimal_places':
  140. msg = msg % field.decimal_places
  141. if error_detail.code == u'max_whole_digits':
  142. msg = msg % field.max_whole_digits
  143. if type(field) == fields.DateTimeField:
  144. if error_detail.code == u'make_aware':
  145. msg = msg % field.timezone
  146. if type(field) == fields.DurationField:
  147. if error_detail.code == u'invalid':
  148. msg = msg % u'[DD] [HH:[MM:]]ss[.uuuuuu]'
  149. if type(field) == fields.DateTimeField:
  150. if error_detail.code == u'make_aware':
  151. msg = msg % field.timezone
  152. if type(field) == fields.ListField:
  153. if error_detail.code == u'min_length':
  154. msg = msg % field.min_length
  155. if error_detail.code == u'max_length':
  156. msg = msg % field.max_length
  157. if type(field) == fields.ModelField:
  158. if error_detail.code == u'max_length':
  159. msg = msg % field.max_length
  160. except:
  161. try:
  162. msg = error_messages[error_detail.code]
  163. if error_detail.code == u'max_length':
  164. msg = msg % field.max_length
  165. if error_detail.code == u'min_length':
  166. msg = msg % field.min_length
  167. except:
  168. msg = str(error_detail)
  169. msg = label + msg
  170. result.append(msg)
  171. return u'<br />'.join(result)