Django:如何覆盖unique_together错误消息?

Geo*_*gie 19 python django validation

在模型的Meta类中,我定义了unique_together.我有一个基于这个模型的ModelForm.当我在这个ModelForm上调用is_valid时,如果unique_together验证失败,将自动引发错误.这一切都很好.

现在我的问题是我对默认的unique_together错误消息不满意.我想覆盖它.我怎样才能做到这一点?对于与字段相关的错误,我可以通过在字段参数上设置error_messages来轻松实现.但unique_together是非字段错误.如何覆盖非字段错误消息?

jif*_*yin 37

你可以在Django 1.7中做到这一点

from django.forms import ModelForm
from django.core.exceptions import NON_FIELD_ERRORS

class ArticleForm(ModelForm):
    class Meta:
        error_messages = {
            NON_FIELD_ERRORS: {
                'unique_together': "%(model_name)s's %(field_labels)s are not unique.",
            }
        }
Run Code Online (Sandbox Code Playgroud)

  • 重要提示:您必须从 `django.core.exceptions` 导入 `NON_FIELD_ERRORS`。 (3认同)
  • 看起来很性感;) (2认同)

小智 25

更新2016/10/20:对于Django> = 1.7,请参阅下面的jifeng-yin更好的答案

覆盖这些错误消息的最好方法可能是覆盖unique_error_message模型上的方法.Django在验证期间遇到唯一性问题时调用此方法来获取错误消息.

你可以只处理你想要的特定情况,并像往常一样让Django处理所有其他情况:

def unique_error_message(self, model_class, unique_check):
    if model_class == type(self) and unique_check == ('field1', 'field2'):
        return 'My custom error message'
    else:
        return super(Project, self).unique_error_message(model_class, unique_check)
Run Code Online (Sandbox Code Playgroud)

  • 这与我在[blog](http://chriskief.com/2013/11/20/customize-djangos-unique_together-error-message/)上看到的解决方案相匹配。但是我有一个问题……为什么我们需要检查`model_class`是否为`self`类型? (2认同)

小智 5

对于 DRF 序列化程序,您可以使用它

from rest_framework import serializers


class SomeSerializer(serializers.ModelSerializer):


    class Meta:
        model = Some
        validators = [
            serializers.UniqueTogetherValidator(
                queryset=model.objects.all(),
                fields=('field1', 'field2'),
                message="Some custom message."
            )
        ]
Run Code Online (Sandbox Code Playgroud)

这是原始来源