【问题标题】:Django DRF display field's verbose_name in error messageDjango DRF 在错误消息中显示字段的详细名称
【发布时间】:2019-03-25 22:30:13
【问题描述】:

当模型字段验证失败时,我希望 DRF 在错误消息中返回字段 verbose_name。

示例:

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',)

如果此字段的 POSTED 数据超过 20 个字符,则响应负载为:

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

为了为用户提供更友好的消息(...并轻松管理错误:-)),我想使用模型字段的详细名称,因此响应负载将是:

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

你有什么想法吗? 谢谢!

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    我认为没有一种简单的方法可以做到这一点。最简单的方法是覆盖序列化程序的errors 属性并使用详细名称更改错误键。

    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
    

    【讨论】:

    • 感谢您的回答。最后,当我在前端使用 Vue.js 时,我选择使用Vee Validate。这样,POSTED 数据在后端和浏览器上得到验证。由于不发布无效数据,这对于后端 API 来说更加轻松。
    猜你喜欢
    • 2012-04-01
    • 1970-01-01
    • 2013-09-30
    • 2011-11-26
    • 2016-04-25
    • 2015-04-05
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    相关资源
    最近更新 更多