0
我想实现的是通过模型窗体更新unique_together约束的实例。 我有一个“关系”模型,例如一个有三个字段的模型,都是外键字段。这个模型是通过一个通过attribut被另一个引用的。 我“relationnal”模型的一部分:具有唯一约束的Django更新模型窗体
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")}))
此代码似乎工作,但同时我调试它,我得到的_all_
错误提交了补充ValidationError
字典键。
它说:
ipdb> errors
{'__all__': [ValidationError([u'Enseignant ue centre with this Enseignantue and Centre already exists.'])]}
我instanciating我的形式:
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)
可能有一些帮助?
THX很多,