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很多,