2014-03-13 50 views
1

我有一個模型,其中一個布爾ModelField依賴於另一個。該模型被配置像這樣:修改Django ModelForm.cleaned_data對保存的模型沒有影響

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

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模型的建立:我都在我看來,處理POST請求,以及內的ModelForm clean功能,像這樣試着這樣做:

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模型。我怎麼能這樣做呢?

回答

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

輝煌,完美的作品。我將它保存在'def clean()'方法中,因此它適用於我的創建和更新視圖而無需重複代碼。感謝幫助!只要SO讓我立刻就會標記爲正確的答案。 – Joseph