Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django模型形式验证_Django_Django Models_Django Forms - Fatal编程技术网

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

现在正试图解决一个有趣的问题

我有一个Django模型,它有一个
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,没错。