我的表单需要有一个有效的网址或有效的文件才能上传:
class ResourceUpload(ModelForm):
...
uploadedfile = forms.FileField('file')
url_address = forms.URLField('url')
...
如何覆盖FileField
和URLField
验证器,以便Django仅在上述两个字段都无效时才引发错误,但只要另一个无效,则只有一个无效?
答案 0 :(得分:7)
您需要将它们设置为required=False
,因此数据库后端不需要填写它们,然后使用form cleaning:
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
答案 1 :(得分: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
答案 2 :(得分:4)
这是我真正有效的解决方案......(已测试)
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
如果field_name2
的输入不是field_name
,这会使'SOMETHING'
成为必填字段。
Django摇滚!
答案 3 :(得分:0)
您应该查看此软件包django-dynamic-model-validation
from django.db import models
from dynamic_validator import ModelFieldRequiredMixin
class MyModel(ModelFieldRequiredMixin, models.Model):
uploadedfile = models.FileField(upload_to='upload/path', blank=True, default='')
url_address = models.URLField(blank=True, default='')
REQUIRED_TOGGLE_FIELDS = ['uploadedfile', 'url_address']
这将验证是否只能提供其中一个字段,如果同时使用这两个字段,则会引发验证错误。