2012-10-09 192 views
6

试图立即解决一个有趣的问题。Django ModelForm验证

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

class Product(models.Model): 
    image = models.ImageField(upload_to='/image/directory/', default='/default/image/path/', blank=True) 

我也有基于该模型,包含image领域的ModelForm,并具有一定的自定义验证。

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,在ModelForm调用is_valid()触发除了模型验证,形成验证,所以当用户提交雏型没有图像,我的自定义表单验证代码试图验证默认模型形象,而不是像它应该做的那样不做任何事情。

除非表单本身具有image字段的值,否则我怎样才能让它不做任何事情?

+0

'blank = True'是数据库级别的验证,'null = True'是模型级别的验证,因此您还需要添加'null = True'。 – karthikr

+3

@karthikr:这不是事实。 null与数据库相关,而空白与验证相关。如果一个字段的值为空,则表单验证将允许输入一个空值。如果一个字段有空白= False,该字段将是必需的。 [更多信息](https://docs.djangoproject.com/en/dev/ref/models/fields/#blanko) –

+2

@karthikr我想你可能想仔细检查一下。从文档'null是纯数据库相关的,而空白是与验证相关的。“https://docs.djangoproject.com/en/dev/ref/models/fields/#field-options –

回答

10

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

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 

问题解决!

相关问题