django rest framework field level validation in form -


i using modelviewset , templatehtmlrenderer use form , process 'post' method. when tried render field error, error rendered [u'this field may not blank.']. how can make render simple message 'this...'?

in html,

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

in 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}) 

and overrode rest framework's default required error message in serializer.py, seemed ignored customized required error message , showed default required error message such 'this field may not blank..'.

in serializer.py,

class userserializer(serializers.modelserializer):      first_name = serializers.regexfield(regex=r'^[a-za-z -.\'\_]+$',                    required=true,             error_messages={'required': _('please enter first name.'),                             'invalid': _('please enter valid name.')}) 

what's wrong here?

the errors not coming because drf running field validations initially. if validations fail, default errors shown.

as per source code, default error messages stored in default_error_messages dictionary. following code snippets:

field:

class field(object):        default_error_messages = {         'required': _('this field required.'),         'null': _('this field may not null.')     } 

charfield:

class charfield(field):     default_error_messages = {         'blank': _('this field may not blank.'),         'max_length': _('ensure field has no more {max_length} characters.'),         'min_length': _('ensure field has @ least {min_length} characters.')     } 

regexfield:

class regexfield(charfield):     default_error_messages = {         'invalid': _('this value not match required pattern.')     } 

so, can can override default_error_messages value overriding serializer's __init__ method , provide custom error message.

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 first name.'          self.fields['first_name'].error_messages['invalid'] = 'please enter valid name.' 

Comments