【问题标题】:django model forms cant change field value in clean()django 模型表单无法更改 clean() 中的字段值
【发布时间】:2016-08-16 15:43:04
【问题描述】:

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

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 代码,如果选中复选框,它会隐藏/显示详细信息字段。

【问题讨论】:

    标签: django django-forms alter modelform


    【解决方案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(例如选中或未选中的复选框),您必须记住在创建 BooleanField 时传入 required=False

    【讨论】:

    • super() 抛出错误:``` super() 需要至少 1 个参数(给定 0)``
    【解决方案2】:

    不要更新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方法你需要先调用super的clean。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-13
      • 2019-03-20
      • 2020-03-29
      • 2014-12-28
      • 2014-05-09
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多