我想要实现的是通过模型表单更新具有unique_together约束的实例。 我是一个"关系"模型,例如具有三个字段的模型,全部作为外键字段。该模型由另一个通过直接引用引用。 我的关系的一部分"关系"型号:
class EnseignantUECentre(models.Model):
statut = models.ForeignKey(StatutEnseignant, blank=False, null=False)
enseignantue = models.ForeignKey('EnseignantUE', blank=False, null=False)
centre = models.ForeignKey('Centre', blank=False, null=False)
class Meta:
unique_together = ('enseignantue', 'centre')
这两个字段enseignantue
和centre
一劳永逸地设置。
只能更新statut
。
我重载了Form._post_clean
方法,以确保不会修改这些字段。
def _post_clean(self):
# si lors d'un update les valeurs centre et enseignantue
# changent il y a erreur: Voir #272
super(EnseignantUECentreForm, self)._post_clean()
import ipdb; ipdb.set_trace()
if 'centre' in self.changed_data:
# on ne récupère pas la valeur depuis self.initial
# mais depuis l'instance
if self.instance is not None:
self._update_errors(ValidationError({'centre': ValidationError("Le centre est déjà associé, vous ne pouvez le modifier")}))
if 'enseignantue' in self.changed_data:
if self.instance is not None:
self._update_errors(ValidationError({'enseignantue': ValidationError("L'enseignantue est déjà associé, vous ne pouvez le modifier")}))
此代码似乎有效但在我调试时,我在ValidationError
错误dict键中收到了补充_all_
。
它说:
ipdb> errors
{'__all__': [ValidationError([u'Enseignant ue centre with this Enseignantue and Centre already exists.'])]}
我将我的表格设为:
from ue.baobab.forms import EnseignantUECentreForm
from ue.baobab.models import EnseignantUECentre
v = {'centre': 214, 'enseignantue': 1, 'statut': 2}
instance = EnseignantUECentre.objects.filter(centre=214)[1]
f = EnseignantUECentreForm(instance=instance, data=v)
f.is_valid()
我知道清理表单进程BaseModelForm._post_clean
会在模型端调用验证(validate_unique)。但为什么"更新"过程在这里不起作用?
我在这里遗漏了一些非常明显的东西! Model.save(force_update=True)
可以提供一些帮助吗?
很多,
答案 0 :(得分:0)
我认为你需要做格式
self.add_error('centre', "error message")