2016-02-22 54 views
-1

目前,如果需要的場,這可以通過空白=假參數執行,如:Django的形式空白=假

models.py

address1 = models.CharField(max_length=255,null=False,blank=False) 

但是,驗證之前POST操作執行,試圖提交包含空字段表格時產生這樣的:

Example 1

我寧願驗證,以在後續步驟來完成,像這樣:

models.py

address1 = models.CharField(max_length=255,null=False,blank=true) 

forms.py

class AddressForm(forms.ModelForm): 
    def __init__(self,*args,**kwargs): 
     super(AddressForm,self).__init__(*args,**kwargs) 
     self.fields['address1'].required = True 

這產生了嘗試提交包含空字段的表單時的結果如下:

Example 2

但是這個問題(據我所知)是我需要明確說明每個字段的required屬性在個案的基礎上。

有沒有什麼辦法可以將blank=False作爲required=True屬性的代表,將第一個表單驗證(上面)抑制爲有利於第二個?

+0

什麼?我不明白你的問題。爲什麼你想要的東西矛盾。 'Model.Field.blank'相當於'not Form.Field.required' – Yeo

+0

好的,像這樣,我想指定blank = False(在模型級別),但我不想要那個彈出框「請填寫這個字段「,而是,我想紅色突出顯示」此字段是必需的「,而不是。 –

回答

1

的ModelForm運行表單驗證,然後模型驗證:

有參與在驗證的ModelForm兩個主要步驟:

驗證形式

驗證模型實例

因此,您必須在繼承模型驗證之前手動添加所需的額外表單驗證。 然而,已經需要爲空白字段默認的ModelForm場:

如果模型領域中有空白= true,則需要設置爲False上 表單域。否則,required = True

您可以更改錯誤消息。如果你使用這個額外的驗證了很多,你可以使用一個混合:

class BlankToRequiredMixin(object): 
    def set_required(self):  
     model = self._meta.model 
     for field_name,form_field in self.fields.iteritems(): 
      if not model._meta.get_field(field_name).blank: 
       form_field.error_messages={'required': 'This field is required'} # to make it required in addtion to non-blank set .required=True 

然後,設置required=True對於那些非空模型中的所有領域:

class AddressForm(forms.ModelForm,BlankToRequiredMixin): 
    def __init__(self,*args,**kwargs): 
     super(AddressForm,self).__init__(*args,**kwargs) 
     self.set_required() 

以類似的方式您可以根據模型驗證屬性將其他驗證添加到表單字段。對於外觀,更改小部件並在mixin中設置字段小部件。

+0

'請填寫此字段'彈出框仍然出現,這個mixin不應該爲模型字段設置'blank = True'嗎? –

+0

換句話說,從'blank = False,required = False'移動到'blank = True,required = True' –

+0

更改字段屬性需要遷移。空白=真有缺點,如果您忘記required = True,它不會警告您。 –