2017-04-09 7 views
0

私が達成しようとしているのは、モデルフォームを通じてunique_together制約でインスタンスを更新することです。"relationnal"モデルがあります。 3つのフィールドを持つモデル。すべてが外部キーフィールドです。このモデルは、スルー属性を介して別のモデルによって参照されます。 私の「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_エラーdictのキーに提出された補助的なValidationErrorを取得します。

それは言う:

ipdb> errors 
{'__all__': [ValidationError([u'Enseignant ue centre with this Enseignantue and Centre already exists.'])]} 

として、私は自分のフォームをinstanciatingている:私は、フォームのプロセスを清掃するモデル側(validate_unique)の検証を呼び出しBaseModelForm._post_cleanことを理解

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() 

。しかし、なぜ「更新」プロセスがここで機能していないのですか? 私は本当にここで何かが欠けている! Model.save(force_update=True)は助けになるでしょうか?

Thxをたくさん、

答えて

0

は、私はあなたが形式で行う必要があると思います

self.add_error('centre', "error message") 
関連する問題