在django admin中验证图像大小

问题描述 投票:21回答:3

我看到很多有Django应用程序的图片上传人员在上传后会自动调整图像大小。对某些情况来说这很好,但我不想这样做。相反,我只是想强制用户上传已经适当大小的文件。

我想要一个ImageField,我强制用户上传100x200的图像。如果他们上传的图片不是那么大,我希望管理表单返回无效。我也希望能够为宽高比做同样的事情。我想强制用户上传16:9的图像并拒绝任何不符合的上传。

我已经知道如何获取图像的宽度和高度,但是在图像上传之后我才能做到服务器端,并且表单已成功提交。如果可能的话,如何更早地检查?

python django image django-forms python-imaging-library
3个回答
48
投票

正确的地方是在表单验证期间。 一个简单的例子(稍后将编辑/集成更多信息):

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

class myForm(forms.ModelForm):
   class Meta:
       model = myModel
   def clean_picture(self):
       picture = self.cleaned_data.get("picture")
       if not picture:
           raise forms.ValidationError("No image!")
       else:
           w, h = get_image_dimensions(picture)
           if w != 100:
               raise forms.ValidationError("The image is %i pixel wide. It's supposed to be 100px" % w)
           if h != 200:
               raise forms.ValidationError("The image is %i pixel high. It's supposed to be 200px" % h)
       return picture

class MyAdmin(admin.ModelAdmin):
    form = myForm

admin.site.register(Example, MyAdmin)

2
投票

在模型文件中使用此函数,

from django.core.exceptions import ValidationError

def validate_image(fieldfile_obj):
    filesize = fieldfile_obj.file.size
    megabyte_limit = 2.0
    if filesize > megabyte_limit*1024*1024:
        raise ValidationError("Max file size is %sMB" % str(megabyte_limit))

class Company(models.Model):
    logo = models.ImageField("Logo", upload_to=upload_logo_to,validators=[validate_image], blank=True, null=True,help_text='Maximum file size allowed is 2Mb')

-1
投票

这可能是这个问题的愚蠢/非常相似:

Using jQuery, Restricting File Size Before Uploading

我认为没有办法以你想要的方式去做。 Agos解决方案是要走的路......

编辑:链接的SO问题中的一个答案谈到使用flash来做到这一点。因此虽然可能可以使用其他技术,但我认为你不能用直接的javascript做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.