你如何使django表单验证动态化?

sit*_*nny 4 forms django

我有一个表单,需要有一个有效的URL或一个有效的文件上传:

class ResourceUpload(ModelForm):
   ...        
   uploadedfile = forms.FileField('file')
   url_address = forms.URLField('url') 
   ...
Run Code Online (Sandbox Code Playgroud)

我如何覆盖FileFieldURLField验证器,以便Django只在上面的两个字段都无效时才引发错误,但只要另一个有效,除了一个无效?

Dom*_*ger 7

您需要将它们设置为required=False,因此数据库后端不需要它们都填写,然后使用表单清理:

import forms

class ResourceUpload(ModelForm):
   ...        
   uploadedfile = forms.FileField(required = False, upload_to='put/files/here')
   url_address = forms.URLField(required = False) 
   ...

   def clean(self):
       cleaned_data = self.cleaned_data
       uploadedfile = cleaned_data.get("uploadedfile ")
       url_address = cleaned_data.get("url_address ")

       if not uploadedfile and mot url_address :
           raise forms.ValidationError("Provide a valid file or a valid URL.")

       return cleaned_data          
Run Code Online (Sandbox Code Playgroud)


小智 7

我的解决方案
专业人员:它为真正需要的字段和默认错误消息保留星号

class Form(forms.ModelForm):
    field1 = SelectField
    field2 = ...
    field3 = ...

    def __init__(self, *args, **kwargs):
        super(Form, self).__init__(*args, **kwargs)
        if kwargs['data']:
            if kwargs['data'].get('field1') == '1':
                self.fields['field2'].required = True
                self.fields['field3'].required = False
            elif kwargs['data'].get('field1') == '2':
                self.fields['field2'].required = False
                self.fields['field3'].required = True
Run Code Online (Sandbox Code Playgroud)


CIF*_*CIF 5

这是我真正有效的解决方案......(已测试)

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

    if self.data and self.data.get('field_name') != 'SOMETHING':
        self.fields.get('field_name2').required = True
Run Code Online (Sandbox Code Playgroud)

field_name2如果field_name的输入不是,这将成为必填字段'SOMETHING'。姜戈摇滚!