Django 不允许小于特定尺寸的图像

Django 不允许小于特定尺寸的图像,django,django-models,django-views,Django,Django Models,Django Views,我有一个模型,可以保存用户配置文件图像。如果上传的图像大于200x200像素,则我们将调整大小为200x200。如果图像位于200x200,则返回该图像。我现在想要的是向用户抛出一个错误,说这个图像太小,是不允许的。以下是我所拥有的: class Profile(models.Model): GENDER_CHOICES = ( ('M', 'Male'), ('F', 'Female'), ) user = models.OneTo

我有一个模型,可以保存用户配置文件图像。如果上传的图像大于200x200像素,则我们将调整大小为200x200。如果图像位于200x200,则返回该图像。我现在想要的是向用户抛出一个错误,说这个图像太小,是不允许的。以下是我所拥有的:

class Profile(models.Model):
    GENDER_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
    )
    user    = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
    bio     = models.CharField(max_length=200, null=True)
    avatar  = models.ImageField(upload_to="img/path")
    gender  = models.CharField(max_length=1, choices=GENDER_CHOICES, null=True)

    def save(self, *args, **kwargs):
        super(Profile, self).save(*args, **kwargs)
        if self.avatar:
            image = Image.open(self.avatar)
            height, width = image.size
            if height == 200 and width == 200:
                image.close()
                return

            if height < 200 or width < 200:
                return ValidationError("Image size must be greater than 200")
            image = image.resize((200, 200), Image.ANTIALIAS)
            image.save(self.avatar.path)
            image.close()
类配置文件(models.Model):
性别选择=(
(‘M’、‘男’),
(‘F’、‘女性’),
)
user=models.OneToOneField(user,null=True,on_delete=models.CASCADE)
bio=models.CharField(最大长度=200,null=True)
avatar=models.ImageField(上传到=“img/path”)
gender=models.CharField(max_length=1,choices=gender_choices,null=True)
def保存(自身、*args、**kwargs):
超级(配置文件,自我)。保存(*args,**kwargs)
如果self.avatar:
image=image.open(self.avatar)
高度、宽度=图像大小
如果高度==200,宽度==200:
image.close()
返回
如果高度<200或宽度<200:
返回ValidationError(“图像大小必须大于200”)
image=image.resize((200200),image.ANTIALIAS)
image.save(self.avatar.path)
image.close()

当图像的宽度或高度小于200px时,不应上载图像。但是,图像正在上载。如何才能阻止这种情况发生?

您可以通过以下形式执行此操作,而不是在
save()
方法中执行此操作:

from django.core.files.images import get_image_dimensions
from django import forms

class ProfileForm(forms.ModelForm):
   class Meta:
       model = Profile

   def clean_avatar(self):
       picture = self.cleaned_data.get("avatar")
       if not picture:
           raise forms.ValidationError("No image!")
       else:
           w, h = get_image_dimensions(picture)
           if w < 200:
               raise forms.ValidationError("The image is %i pixel wide. It's supposed to be more than 200px" % w)
           if h < 200:
               raise forms.ValidationError("The image is %i pixel high. It's supposed to be 200px" % h)
       return picture
从django.core.files.images导入获取图像尺寸
来自django导入表单
类ProfileForm(forms.ModelForm):
类元:
模型=外形
def clean_化身(自我):
picture=self.cleaned_data.get(“化身”)
如果没有图片:
raise forms.ValidationError(“无图像!”)
其他:
w、 h=获取图像尺寸(图片)
如果w<200:
raise forms.ValidationError(“图像为%i像素宽,应该大于200px”%w)
如果h<200:
raise forms.ValidationError(“图像为%i像素高,应为200px”%h)
返回图片

原因是,当您调用
save()
时,图像已经上载。因此,最好在表单中执行此操作。

您可以在表单中执行此操作,而不是在
save()
方法中执行此操作:

from django.core.files.images import get_image_dimensions
from django import forms

class ProfileForm(forms.ModelForm):
   class Meta:
       model = Profile

   def clean_avatar(self):
       picture = self.cleaned_data.get("avatar")
       if not picture:
           raise forms.ValidationError("No image!")
       else:
           w, h = get_image_dimensions(picture)
           if w < 200:
               raise forms.ValidationError("The image is %i pixel wide. It's supposed to be more than 200px" % w)
           if h < 200:
               raise forms.ValidationError("The image is %i pixel high. It's supposed to be 200px" % h)
       return picture
从django.core.files.images导入获取图像尺寸
来自django导入表单
类ProfileForm(forms.ModelForm):
类元:
模型=外形
def clean_化身(自我):
picture=self.cleaned_data.get(“化身”)
如果没有图片:
raise forms.ValidationError(“无图像!”)
其他:
w、 h=获取图像尺寸(图片)
如果w<200:
raise forms.ValidationError(“图像为%i像素宽,应该大于200px”%w)
如果h<200:
raise forms.ValidationError(“图像为%i像素高,应为200px”%h)
返回图片

原因是,当您调用
save()
时,图像已经上载。因此,最好以表格的形式进行。

表格或清洁。保存有点太晚了嗯,我正在尝试在我的模板中执行
{{form.avatar.errors}
,但是我没有看到错误消息。此外,这也行得通,图像不再被上传。嗯,你能试试不带
striptags
吗?ie
{{form.avatar.errors}
我的问题是:表单还是干净。保存有点太晚了嗯,我正在尝试在我的模板中执行
{{form.avatar.errors}
,但是我没有看到错误消息。此外,这也行得通,图像不再被上传。嗯,你能试试不带
striptags
吗?ie
{{form.avatar.errors}
这里是我的问题: