2017-04-09 44 views
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') 

論文兩個字段,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")})) 

此代碼似乎工作,但同時我調試它,我得到的_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很多,

回答

0

我認爲你需要在格式上做

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