【问题标题】:Modifying Django ModelForm.cleaned_data has no effect on saved Model修改 Django ModelForm.cleaned_data 对保存的模型没有影响
【发布时间】:2014-04-18 07:22:54
【问题描述】:

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

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 模型的视图中的 sn-p:

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

我似乎无法将 True 的 has_been_ctcs 值传播到 Situation 模型。我该怎么做呢?

【问题讨论】:

    标签: django forms django-models django-forms


    【解决方案1】:

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

    【讨论】:

    • 太棒了,完美运行。我将它保存在 def clean() 方法中,因此它适用于我的创建和更新视图,而无需重复代码。感谢帮助!只要允许,我就会将其标记为正确答案。
    猜你喜欢
    • 2015-05-06
    • 1970-01-01
    • 2020-07-23
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 2021-03-24
    相关资源
    最近更新 更多