覆盖SlugRelatedField上的default_error_messages

时间:2014-07-11 00:00:07

标签: django django-rest-framework

来自django-rest-framework文档:

  

每个序列化程序字段类构造函数至少采用这些参数。一些Field类采用其他特定于字段的参数,但应始终接受以下内容:

     
      
  • error_messages - 错误消息的错误代码字典。
  •   

我试图覆盖" does_not_exist" SlugRelatedField中的错误消息,如:

example = SlugRelatedField(slug_field='label', error_messages={"does_not_exist": "Some custom error message."})

并收到错误:

  

并非在字符串格式化期间转换所有参数

非常感谢任何关于如何进行的提示。

2 个答案:

答案 0 :(得分:0)

错误消息的呈现方式如下:

raise ValidationError(self.error_messages['does_not_exist'] %
                              (self.slug_field, smart_text(data)))

因此它会强制您包含两个%s占位符。

这是默认值:

'does_not_exist': _("Object with %s=%s does not exist."),

如果你想省略%s个参数,那么除了覆盖整个from_native之外别无他法。

答案 1 :(得分:0)

自从提出这个问题以来,我认为django-rest-framework改变了它的工作方式。

使用DRF版本3.8.2,SlugRelatedField的默认错误消息现在为:

default_error_messages = {
    'does_not_exist': _('Object with {slug_name}={value} does not exist.'),
    'invalid': _('Invalid value.'),
}

我能够通过以下方法成功地覆盖dos_not_exist错误:

field = SlugRelatedField(
    error_messages={
        'does_not_exist': 'Foo error field={value} does not exist.',
    }
)

请注意,我仅使用DRF插入字符串之一的值-value,而不使用slug_name。效果很好。