Django ModelForm 验证

标签 django django-models django-forms

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

我有一个带有 image 的 Django 模型字段不是必需的,但在创建新模型实例时设置为默认值。

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 的值 field ?

最佳答案

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

The Django docs state that

...a model form instance bound to a model object will contain a self.instance attribute that gives model form methods access to that specific model 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

问题解决了!

关于Django ModelForm 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12806771/

相关文章:

python - 在 Django 中缓存静态文件

Django 注册管理

python - 原始查询必须包含主键错误,即使我正在执行 SELECT *

Django:通过另一个多对多关系访问多对多对象

python - 使用 django-social-auth (omab) 自动刷新访问 token

django - 如何在没有输入字段的情况下在 Django 模型中存储数据

django - 查询效率

html - Django : HTML form action directing to view (or url? ) 有 2 个参数

python - 如何格式化 Django 表单中选择字段中的选项标签?

python - Django 表单不会覆盖以前的条目