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
Post a Comment