Django ModelForm验证

时间:2012-10-09 19:10:15

标签: 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 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

问题是per the docs,在is_valid()上调用ModelForm会触发模型验证以及表单验证,因此当用户提交没有图像的模型表单时,我的自定义表单验证代码试图验证默认的模型图像,而不是像它应该做的那样无所事事。

除非表单本身具有image字段的值,否则如何使其不执行任何操作?

1 个答案:

答案 0 :(得分:12)

以简单的方式解决它。在这里添加答案,以防它对其他人有帮助。

The Django docs state that

  

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

问题解决了!