在模型的Meta类中,我定义了unique_together。我有一个基于这个模型的ModelForm。当我在这个ModelForm上调用is_valid时,如果unique_together验证失败,将自动引发错误。这一切都很好。
现在我的问题是我对默认的unique_together错误消息不满意。我想覆盖它。我怎样才能做到这一点?对于与字段相关的错误,我可以通过在字段参数上设置error_messages来轻松实现。但unique_together是非字段错误。如何覆盖非字段错误消息?
答案 0 :(得分:35)
您可以在Django 1.7中执行this
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.",
}
}
答案 1 :(得分: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)
答案 2 :(得分:1)
经过快速检查后,unique_together
内的django.db.models.Model.unique_error_message
验证错误似乎是硬编码的:
def unique_error_message(self, model_class, unique_check):
opts = model_class._meta
model_name = capfirst(opts.verbose_name)
# A unique field
if len(unique_check) == 1:
field_name = unique_check[0]
field_label = capfirst(opts.get_field(field_name).verbose_name)
# Insert the error into the error dict, very sneaky
return _(u"%(model_name)s with this %(field_label)s already exists.") % {
'model_name': unicode(model_name),
'field_label': unicode(field_label)
}
# unique_together
else:
field_labels = map(lambda f: capfirst(opts.get_field(f).verbose_name), unique_check)
field_labels = get_text_list(field_labels, _('and'))
return _(u"%(model_name)s with this %(field_label)s already exists.") % {
'model_name': unicode(model_name),
'field_label': unicode(field_labels)
}
所以也许您应该尝试从模型中覆盖此方法,以插入自己的消息!?
然而,我没有尝试过,这似乎是一个相当野蛮的解决方案!但如果你没有更好的东西,你可以试试......
答案 3 :(得分:1)
对于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."
)
]
这是原始的source。
答案 4 :(得分:0)
注意:自从这个答案以来,Django发生了很多变化。所以最好检查其他答案......
如果sebpiq是真的(因为我不检查源代码),那么就有一个 你可以做的可能的解决办法,但这是艰难的方式......
您可以在表单as it described here
中定义验证规则您可以在多个字段中看到examples验证,因此通过使用此方法,您可以在执行标准django唯一检查之前定义唯一的一起检查...
或者最糟糕的一个,您可以在尝试保存对象之前在视图中进行验证...
答案 5 :(得分:-1)
您可以查看模型中的覆盖django/db/models/base.py:Model._perform_unique_checks()。
在该方法中,您可以获得“原始”错误:
errors = super(MyModel, self)._perform_unique_checks(unique_checks)
- 然后修改并向上返回。