2017-04-09 41 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")