【问题标题】:django rest framework field level validation in form表单中的 django rest 框架字段级别验证
【发布时间】:2015-08-17 07:17:49
【问题描述】:

我正在使用 ModelViewSet 和 TemplateHTMLRenderer 来使用表单和处理“发布”方法。当我尝试呈现字段错误时,呈现的错误 [u'This field may not be blank.']。我怎样才能让它呈现简单的消息'This...'?

在 HTML 中,

<form action="." method="post" id="myform">
     <input name="first_name" type="text">
     <ul> {{ errors.first_name }}</ul>
</form>

在views.py中,

class UserViewSet(viewsets.ModelViewSet):
   queryset = User.objects.all()
   serializer_class = UserSerializer
   renderer_classes = (renderers.JSONRenderer, renderers.TemplateHTMLRenderer)
   template_name = 'account.html'

   def list(self, request, *args, **kwargs):
     response = super(AccountViewSet, self).list(request, *args, **kwargs)
     if request.accepted_renderer.format == 'html':
        return Response({'data': response.data}, template_name=self.template_name)
     return response

   def create(self, request):
     serializer = self.serializer_class(data=request.data)
     if serializer.is_valid():
        User.objects.create_user(**serializer.validated_data)
        return Response(serializer.validated_data)
     return Response({'errors': serializer.errors})

我在 serializer.py 中覆盖了 rest 框架的默认必需错误消息,但它似乎忽略了自定义的必需错误消息并显示了默认的必需错误消息,例如“此字段可能不是空白..”。

在serializer.py中,

class UserSerializer(serializers.ModelSerializer):
     first_name = serializers.RegexField(regex=r'^[a-zA-Z -.\'\_]+$',       
            required=True,
            error_messages={'required': _('Please enter your first name.'),
                            'invalid': _('Please enter a valid name.')})

这里有什么问题?

【问题讨论】:

标签: django validation field django-rest-framework


【解决方案1】:

错误不会出现,因为 DRF 最初正在运行字段验证。如果这些验证失败,则会显示默认错误。

根据源代码,默认错误消息存储在default_error_messages 字典中。以下是一些代码sn-ps:

字段:

class Field(object):   
    default_error_messages = {
        'required': _('This field is required.'),
        'null': _('This field may not be null.')
    }

字符域:

class CharField(Field):
    default_error_messages = {
        '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.')
    }

正则表达式字段:

class RegexField(CharField):
    default_error_messages = {
        'invalid': _('This value does not match the required pattern.')
    }

因此,您可以通过覆盖序列化程序的 __init__ 方法来覆盖 default_error_messages 值并提供您的自定义错误消息。

class UserSerializer(serializers.ModelSerializer):
     first_name = serializers.RegexField(regex=r'^[a-zA-Z -.\'\_]+$',       
            required=True)

     def __init__(self, *args, **kwargs):
         super(UserSerializer, self).__init__(*args, **kwargs)

         self.fields['first_name'].error_messages['required'] = 'Please enter your first name.'
         self.fields['first_name'].error_messages['invalid'] = 'Please enter a valid name.'

【讨论】:

  • 我在字段中将其更改为“空白”而不是“必填”;有些字段使用“必填”,有些使用“空白”。谢谢 Chandu,Rahul。
猜你喜欢
  • 2014-11-25
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多