2016-08-16 75 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