9

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

我有一个 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

问题是,根据文档is_valid(),除了表单验证之外,调用ModelForm触发器模型验证,因此当用户提交没有图像的模型表单时,我的自定义表单验证代码会尝试验证默认模型图像,而不是什么都不做正如它应该的那样。

除非表单本身具有该字段的值,否则我如何让它不做任何事情image

4

1 回答 1

17

只是以非常简单的方式解决了它。在此处添加答案,以防对其他人有帮助。

Django 文档指出

...绑定到模型对象的模型表单实例将包含一个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

问题解决了!

于 2012-10-09T19:38:28.323 回答