我有一个表单,需要有一个有效的URL或一个有效的文件上传:
class ResourceUpload(ModelForm):
...
uploadedfile = forms.FileField('file')
url_address = forms.URLField('url')
...
Run Code Online (Sandbox Code Playgroud)
我如何覆盖FileField
和URLField
验证器,以便Django只在上面的两个字段都无效时才引发错误,但只要另一个有效,除了一个无效?
您需要将它们设置为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)
这是我真正有效的解决方案......(已测试)
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'
。姜戈摇滚!
归档时间: |
|
查看次数: |
4653 次 |
最近记录: |