私が達成しようとしているのは、モデルフォームを通じて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')
二、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_
エラー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をたくさん、