この質問のように、同様のvalidate_uniqueオーバーライドを持つモデルがいくつかあります。これはmodels.pyにあります:
class TeachingGroup(models.Model):
cohort = models.ForeignKey(Cohort)
name = models.CharField(max_length=26)
slug = models.CharField(max_length=30, editable=False)
class Meta:
unique_together = ('cohort', 'name')
def validate_unique(self, exclude = None):
from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
slugfodder = u'%s %s' % (self.cohort.year_group.shortname, self.name)
self.slug = slugify(slugfodder)
options = dict(slug = self.slug, cohort__year_group__school = self.cohort.year_group.school)
hits = TeachingGroup.objects.exclude(pk=self.pk).filter(**options)
if hits.exists():
template = """The name is used for database lookups,
and '{0}' is too similar to '{1}', as both become
'{2}' in your web browser's address bar."""
message = template.format(self.name, hits[0].name, self.slug)
raise ValidationError({NON_FIELD_ERRORS: [message]})
super(TeachingGroup, self).validate_unique(exclude=exclude)
そこにコメントするのに十分な評判はありませんが、最後に行を追加することで、モデルの検証super
をバイパスしないようです。Meta: unique_together
簡潔にするために、モデル構造は含めていませんが、上記の検証はすべて、既存のオブジェクトを変更するために、管理サイトで正常に機能しています(スラッグが同一になるように名前を十分に類似させた場合、エラーが表示されます)新しいオブジェクトを追加するため。
レンダリングされたWebページでは、既存のレコードを変更すると期待どおりにエラーメッセージが表示されますが、フォームから(インスタンスなしで)新しいオブジェクトを追加すると、奇妙なことにエラーメッセージが表示されます。代わりに、次のような一連のエラーが発生します。
File "models.py" in validate_unique
125. slugfodder = u'%s %s' % (self.cohort.year_group.shortname, self.name)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/fields/related.py" in __get__
301. raise self.field.rel.to.DoesNotExist
pdbの場合:
-> slugfodder = u'%s %s' % (self.cohort.year_group.shortname, self.name)
(Pdb) self
*** DoesNotExist:
では、管理サイトはどのように「自己」に対して検証するのでしょうか。私の検証は次のようなことをする必要がありますsave(commit = False)
か?
もちろん、さらに詳細を追加することもできますが、関連するものはここにあると思います。