修改Django ModelForm.cleaned_data对保存的模型没有影响

时间:2014-03-13 13:50:11

标签: django forms django-models django-forms

我有一个模型,其中一个布尔型ModelField依赖于另一个。模型配置如下:

class Situation(models.Model):
    ctcs = models.BooleanField(verbose_name="Cross-Technology Critical Situation", blank=True)
    has_been_ctcs = models.BooleanField(editable=False, default=False)

ctcs字段在此模型的ModelForm中呈现为复选框。我想要做的是,如果检查了ctcs字段,我还想将has_been_ctcs设置为True。所以我正在做的是在ModelForm上设置cleaned_data['has_been_ctcs'] = True。我已经尝试在处理POST请求的视图中以及在ModelForm clean函数中执行此操作,如下所示:

class SituationForm(forms.ModelForm):
   def clean(self):
       cleaned_data = super(SituationForm, self).clean()
       ctcs = cleaned_data.get("ctcs")
       if ctcs:
           self.cleaned_data['has_been_ctcs'] = True
       return cleaned_data

以下是视图中的片段,用于处理新Situation模型的创建:

sit_form = SituationForm(request.POST)
if sit_form.is_valid():
    print sit_form.cleaned_data['ctcs']  # Prints True
    if sit_form.cleaned_data['ctcs']:
        print "Checking form has_been_ctcs"
        # Have also tried setting sit_form.cleaned_data['has_been_ctcs'] here, no difference from doing it in `def clean()`
        print sit_form.cleaned_data['has_been_ctcs']  # Prints True
    sit = sit_form.save()
    print sit.has_been_ctcs  # Prints False

我似乎无法将has_been_ctcs值传递给Situation模型。我该怎么做呢?

1 个答案:

答案 0 :(得分:3)

cleaned_data仅适用于表单中包含的字段。你想要做的是:

sit_form = SituationForm(request.POST)
if sit_form.is_valid():
    if sit_form.cleand_data['ctcs']:
        sit_form.instance.has_been_ctcs = True
    sit = sit_form.save()