2012-05-13 48 views
1

我有一個Django模型和來自。django modelform驗證從數據庫獲得字段,如果不是如果形式

class Settings(models.Model): 
    field_1 = models.BooleanField() 
    field_2 = models.CharField(max_length = 255) 

和形式

class SiteSettingsForm(forms.ModelForm): 
    class Meta: 
     model = SiteSettings 

我有一個HTML形式,並且當沒有檢查布爾field_1的複選框,則第二場(field_2)被禁用。

問題是,如果我嘗試保存表單,則表示存在錯誤,因爲field_2爲空。

我想,如果field_2沒有被禁用,而不是空的,要獲得錯誤,但如果field_2被禁用,我希望表單從數據庫中取值。

我已經試過這樣:

class SettingsForm(forms.ModelForm): 
    class Meta: 
     model = Settings 

    def __init__(self, *args, **kwargs): 
     super(SettingsForm, self).__init__(*args, **kwargs) 

    def clean(self): 
     field_1 = self.data.get('field_1','') 
     if not field_1: # field_2 is disabled 
      self.data['field_2'] = self.instance.field_2 # so get from db 
     super(SettingsForm, self).clean() 
     return self.cleaned_data 

的問題是,我得到一個錯誤:

This QueryDict instance is immutable

+0

爲什麼你會嘗試把它變成'self.data'而不是'self.cleaned_data'? –

回答

2

更改您爲它的形式:

class SettingsForm(forms.ModelForm): 
    class Meta: 
     model = Settings 

    def __init__(self, *args, **kwargs): 
     super(SettingsForm, self).__init__(*args, **kwargs) 

    def clean(self): 
     cleaned_data = super(SettingsForm, self).clean() 
     field_1 = cleaned_data.get('field_1','') 
     if not field_1: # field_2 is disabled 
      cleaned_data['field_2'] = self.instance.field_2 # so get from db 
     self.cleaned_data = cleaned_data 
     return self.cleaned_data 
相關問題