Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django admin中验证图像大小_Python_Django_Image_Django Forms_Python Imaging Library - Fatal编程技术网

Python 在django admin中验证图像大小

Python 在django admin中验证图像大小,python,django,image,django-forms,python-imaging-library,Python,Django,Image,Django Forms,Python Imaging Library,我看到很多人使用Django应用程序上传图像后会自动调整图像大小。这在某些情况下是好的,但我不想这样做。相反,我只是想强迫用户上传一个已经大小合适的文件 我希望有一个ImageField,在这里我强制用户上传100x200的图像。如果他们上传的图像大小不完全相同,我希望管理员表单返回为无效。我也希望能够为纵横比做同样的事情。我想强制用户上传16:9的图像,并拒绝任何不符合要求的上传 我已经知道如何获取图像的宽度和高度,但在图像上传并成功提交表单之前,我无法在服务器端完成该操作。如果可能的话,我怎

我看到很多人使用Django应用程序上传图像后会自动调整图像大小。这在某些情况下是好的,但我不想这样做。相反,我只是想强迫用户上传一个已经大小合适的文件

我希望有一个ImageField,在这里我强制用户上传100x200的图像。如果他们上传的图像大小不完全相同,我希望管理员表单返回为无效。我也希望能够为纵横比做同样的事情。我想强制用户上传16:9的图像,并拒绝任何不符合要求的上传


我已经知道如何获取图像的宽度和高度,但在图像上传并成功提交表单之前,我无法在服务器端完成该操作。如果可能的话,我怎样才能更早地检查此项?

正确的做法是在表单验证期间进行检查。
一个快速示例(稍后将编辑/集成更多信息):


这可能是重复/非常类似于这个问题:

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


编辑:链接SO问题中的一个答案谈到了如何使用flash进行编辑。因此,虽然可以使用其他一些技术,但我不认为您可以使用纯javascript来实现它。

在模型文件中使用此函数

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')

更新上述答案的Models.py版本

from django.core.exceptions import ValidationError
from django.core.files.images import get_image_dimensions

class Model(models.Model):
 photo = models.ImageField()

 def clean(self):

    if not self.photo:
        raise ValidationError("No image!")
    else:
        w, h = get_image_dimensions(self.photo)
        if w != 200:
            raise ValidationError("The image is %i pixel wide. It's supposed to be 200px" % w)
        if h != 200:
            raise ValidationError("The image is %i pixel high. It's supposed to be 200px" % h)

我太慢了,下面是相关链接:虽然这个解决方案很酷,但OP说他想在提交表单之前检查图像的尺寸。所以它必须是客户端的东西。还是我误读了他的最后一段?我的意思不一定是在表单提交之前,只要它是在模型保存之前。即使使用了提交前验证器,您也永远不能信任客户端上运行的代码,所以需要仔细检查。真的很好的解决方案。非常感谢。查看
如果不是图片
。我们可以将其应用于图像字段的内容类型吗?因此,如果不是picture,它可以是
,如果不是picture.content\u type==“jpg”
,而不是
,另一种可能的技术可能是Java小程序。我见过很多上传者都是这样处理的。如果你真的想允许大量的上传,它也很有用。这是行不通的。在保存文件之前,以这种方式从验证器引用文件,只需返回
***FileNotFoundError:[Errno 2]没有这样的文件或目录:'/srv/www/media/80329e39-5c5c-4e79-8e32-51087ae00f6a'
。也许它可以处理Django不保存为
InMemoryUploadedFile
对象的文件,这些文件位于
/tmp
中或与实际文件类似的位置。不过,我还没有测试过它。看看这个库。我刚刚创建了它,并试图解决这种情况。问候:)
from django.core.exceptions import ValidationError
from django.core.files.images import get_image_dimensions

class Model(models.Model):
 photo = models.ImageField()

 def clean(self):

    if not self.photo:
        raise ValidationError("No image!")
    else:
        w, h = get_image_dimensions(self.photo)
        if w != 200:
            raise ValidationError("The image is %i pixel wide. It's supposed to be 200px" % w)
        if h != 200:
            raise ValidationError("The image is %i pixel high. It's supposed to be 200px" % h)