2016-08-16 59 views
0

我有一个简单的模型形式,对此我添加了一个简单的复选框不能改变字段值:Django的模型形式干净()

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

回答

0
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(例如,选中或取消选中复选框),你必须记住创建BooleanFieldrequired=False传递。

+1

然后由于某种原因,你的代码不适合我 – user3599803

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