django模型在clean()中不能改变字段值

时间:2016-08-16 15:43:04

标签: django django-forms alter modelform

我有一个简单的模型表单,我添加了一个简单的复选框:

class OrderForm(forms.ModelForm):
   more_info = models.BooleanField(widget=forms.CheckboxInput())

   def clean(self):
        if 'more_info' not in self.cleaned_data:
             self.instance.details = ""
   class Meta:
        model = Order
        fields = ('details', 'address',  ) # more fields

但这不起作用,即使未选中复选框(并且if块已执行,已调试),“详细信息”字段仍会由用户值更新。我也尝试更改self.cleaned_data['details']而不是self.instance.details,但它也不起作用。

这不是那么重要,在客户端我有一个简单的javascript代码,如果选中该复选框,它会隐藏/显示详细信息字段。

2 个答案:

答案 0 :(得分:1)

class OrderForm(forms.ModelForm):
    more_info = models.BooleanField(required=False)

    def clean(self):
        cleaned_data = super().clean()
        if not cleaned_data['more_info']:
            cleaned_data['details'] = ''
        return cleaned_data

来自Customizing validation

  

此方法[clean()]可以根据需要返回完全不同的字典,该字典将用作cleaned_data

此外:

  1. CheckboxInputBooleanField的默认小部件。

  2. BooleanField note

      

    如果您希望在表单中包含可以是TrueFalse的布尔值(例如选中或未选中复选框),则必须记住在创建时传入required=False BooleanField

答案 1 :(得分:0)

不要更新cleaned_data,而是尝试覆盖save方法

def save(self, force_insert=False, force_update=False, commit=True, *args, **kwargs):
    order = super(OrderForm, self).save(commit=False)
    if not self.cleaned_data.get('more_info', False):
         order.details = ""
    if commit:
        order.save()
    return order

此外,如果您想使用clean方法,您需要首先打电话给超级干净。

def clean(self):
    cleaned_data = super(BailiffAddForm, self).clean()
    if not cleaned_data.get('more_info', False):
        ...
    return cleaned_data