stockersky
stockersky

Reputation: 1571

Django DRF display field's verbose_name in error message

When model field validation fail, I would like DRF to return the field verbose_name in the error message.

example :

models.py :

class MyClass(models.Model):
    myfield = model.CharField(max_length=20,\
                              verbose_name="This is the field",\
                              default="blabla")

serialiers.py :

class MyClassSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyClass
        fields = ('myfield',)

If, POSTED data for this field is more than 20 characters, response payload is:

{"myfield":["the error message..........."]}

To make a friendlier message for the users (... and easily manage the errors :-) ) , I'd like to use the model field's verbose_name, so the response payload would be :

{"This is the field":["the error message..........."]}

Do you have any idea? Thanks!

Upvotes: 3

Views: 1331

Answers (1)

zeynel
zeynel

Reputation: 953

I dont think there is an easy way of doing this. The easiest way would be overriding errors property of serializer and changing error keys with verbose name.

class TestSerializer(serializers.ModelSerializer):
    class Meta:
        model = ...
        fields = ('field1', ...)

    @property
    def errors(self):
        # get errors
        errors = super().errors
        verbose_errors = {}

        # fields = { field.name: field.verbose_name } for each field in model
        fields = {field.name: field.verbose_name for field in
                   self.Meta.model._meta.get_fields() if hasattr(field, 'verbose_name')}

        # iterate over errors and replace error key with verbose name if exists
        for field_name, error in errors.items():
            if field_name in fields:
                verbose_errors[str(fields[field_name])] = error
            else:
                verbose_errors[field_name] = error
        return verbose_errors

Upvotes: 2

Related Questions