2016-02-22 51 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,它不会警告您。 –