Django更新具有唯一约束的模型表单

时间:2017-04-09 14:55:06

标签: django model django-forms

我想要实现的是通过模型表单更新具有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')

这两个字段enseignantuecentre一劳永逸地设置。 只能更新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)可以提供一些帮助吗?

很多,

1 个答案:

答案 0 :(得分:0)

我认为你需要做格式

self.add_error('centre', "error message")