Django模型形式验证
现在正试图解决一个有趣的问题 我有一个Django模型,它有一个Django模型形式验证,django,django-models,django-forms,Django,Django Models,Django Forms,现在正试图解决一个有趣的问题 我有一个Django模型,它有一个image字段,这个字段不是必需的,但在创建新模型实例时设置为默认值 class Product(models.Model): image = models.ImageField(upload_to='/image/directory/', default='/default/image/path/', blank=True) 我还有一个基于该模型的ModelForm,它包括image字段,并具有一些自定义验证 class
image
字段,这个字段不是必需的,但在创建新模型实例时设置为默认值
class Product(models.Model):
image = models.ImageField(upload_to='/image/directory/', default='/default/image/path/', blank=True)
我还有一个基于该模型的ModelForm,它包括image
字段,并具有一些自定义验证
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ('image',)
def clean_image(self):
image = self.cleaned_data.get('image', False)
if image:
# validate image
return None
问题是,在ModelForm
上调用is\u valid()
除了表单验证外,还会触发模型验证,因此当用户提交没有图像的模型表单时,我的自定义表单验证代码会尝试验证默认模型图像,而不是像预期的那样什么也不做
我怎样才能让它不做任何事情,除非表单本身有一个
图像
字段的值?只是用非常简单的方法解决了它。在这里添加答案,以防对其他人有所帮助
…绑定到模型对象的模型表单实例将包含一个self.instance
属性,该属性允许模型表单方法访问该特定模型实例
因此,我没有检查ModelForm
是否有图像值,而是检查图像值是否已从保存的实例更改。表单验证现在如下所示:
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ('image',)
def clean_image(self):
image = self.cleaned_data.get('image', False)
if not self.instance.image == image:
# validate image
return None
问题解决了
blank=True
是数据库级别的验证,而null=True
是模型级别的验证,因此您还需要添加null=True
。@karthikr:这不是真的null纯粹与数据库相关,而blank与验证相关。如果字段为blank=True,则表单验证将允许输入空值。如果某个字段为blank=False,则该字段为必填字段。
@karthikr我想你应该再检查一遍。从文档来看,null纯粹与数据库相关,而blank则与验证相关。
谢谢@LoïsDiQual,没错。