【问题标题】:Django validating ImageField dimensions etcDjango 验证 ImageField 尺寸等
【发布时间】:2011-09-30 15:11:42
【问题描述】:

我在下面有一个自定义的清理方法:

def clean_image(self):
    image = self.cleaned_data['image']
    if image:
        from django.core.files.images import get_image_dimensions
        w, h = get_image_dimensions(image)
        if not image.content_type in settings.VALID_IMAGE_FORMATS:
            raise forms.ValidationError(u'Only *.gif, *.jpg and *.png images are allowed.')
        if w > settings.VALID_IMAGE_WIDTH or h > settings.VALID_IMAGE_HEIGHT:
            raise forms.ValidationError(u'That image is too big. The image needs to be ' + str(settings.VALID_IMAGE_WIDTH) + 'px * ' + str(settings.VALID_IMAGE_HEIGHT) + 'px (or less).')
        return image

问题场景是这样的:

图片已上传。我现在想使用使用 ImageField 小部件出现的复选框来清除它。提交表格以明确这一点时,不会发生。

如果我删除了我的自定义清理方法,那么 clear 确实有效。因此我猜我的方法做错了。

【问题讨论】:

  • 尝试取消缩进返回,使其与 if 语句内联,即它始终返回数据。
  • django-vimage 3rd-party 包怎么样?我刚刚创建了它并尝试解决这种情况。问候:)

标签: django


【解决方案1】:

django 实现这个验证有3个问题:

  1. Django 需要获取这些字段的值,总是需要返回一个值
  2. 需要将类 Meta 与您使用的模型名称放在一起。
  3. 在这句话中需要把.get this way

    self.cleaned_data.get['image']
    
  4. 代码如下所示:

    class Meta: 
        model = NameModel    
    
    def clean_image(self):
        image = self.cleaned_data.get['image']
        if image:
            from django.core.files.images import get_image_dimensions
            w, h = get_image_dimensions(image)
            if not image.content_type in settings.VALID_IMAGE_FORMATS:
                raise forms.ValidationError(u'Only *.gif, *.jpg and *.png images are allowed.')
            if w > settings.VALID_IMAGE_WIDTH or h > settings.VALID_IMAGE_HEIGHT:
                raise forms.ValidationError(u'That image is too big. The image needs to be ' +     str(settings.VALID_IMAGE_WIDTH) + 'px * ' + str(settings.VALID_IMAGE_HEIGHT) + 'px (or less).')
        return image
    

【讨论】:

  • 第 1 点是这里的答案 - 您必须确保 clean_image 返回一个值,这允许 Django 管理员清除功能发生。
  • 在将上述内容更改为 image = self.cleaned_data['image'] 之前,我收到“不可下标”错误
【解决方案2】:

我认为它不是从cleaned_data 返回图像。你应该检查一下,因为你的编码看起来不错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2011-07-28
    • 2018-09-22
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多