【问题标题】:Alter uploaded image before saving with Django admin models在使用 Django 管理模型保存之前更改上传的图像
【发布时间】:2020-04-29 14:07:21
【问题描述】:

我有一个保存图像的 Django 模型。但是,在我保存模型之前,我想检查宽度和高度并创建图像的 md5 哈希以检查重复上传。

我没有使用任何自定义表单,我只是尝试使用管理后端上传一些图片。

我正在使用 Django==3.0.5 和 Python 3.8.2

这是我的模型:

from django.db import models
from hashlib import md5
from PIL import Image
from io import BytesIO

class UploadedImage(models.Model):
    """An image upload

    Arguments:
        models {[type]} -- [description]
    """

    name = models.CharField(max_length=255, default='')
    pub_date = models.DateTimeField(auto_now=True)
    image = models.ImageField(upload_to='images/')
    height = models.IntegerField(default=0)
    width = models.IntegerField(default=0)
    extension = models.CharField(max_length=20, null=False, default='')
    hash = models.CharField(max_length=50, null=False, unique=True, db_column='hash', default='')

    def __str__(self):
        return self.name

    @staticmethod
    def hash_exists(hash):
        return UploadedImage.objects.exists(hash=hash)

    def generate_name(self):
        img_id = UploadedImage.objects.values('id').order_by('-id').first()['id'] + 1
        self.name = "%s_%s" % (img_id, self.hash[-4:])

    def save(self, *args, **kwargs):
        # get the actual image???????
        # img = self.request.FILES['image'] ????

        if img:
            self.hash = md5(img).hexdigest()
            try:
                if hash_exists(self.hash):
                    raise ValueError("image hash already exists, duplicate image!")
            except ValueError as err:
                print(err.args)
                return err
            img = Image.open(BytesIO(img))
            self.width, self.height = img.size
            self.extension = img.format.lower()
            self.generate_name()
        else:
            print("no image")
            return ""
        super(UploadedImage, self).save(*args, **kwargs)

但是,我在任何地方都找不到如何访问表单中发送的文件。 我怎样才能访问这些?

【问题讨论】:

    标签: python django python-imaging-library


    【解决方案1】:

    就这样,

    class UploadedImage(models.Model):
        # your code
    
        def save(self, *args, **kwargs):
            if not self.pk:
                self.image  # the image will be here
                # access any class variables using `self` member
            super(UploadedImage, self).save(*args, **kwargs)

    这里的语句,if not self.pk 非常重要,因为它用于识别save 操作是否正在处理新对象

    【讨论】:

    • 感谢这工作。虽然有一件事我不明白。该文件尚未存储在upload_path 中。那么 Pillow 如何打开一个还没有的图片呢?
    • 我不太确定 Pillow 的事,但PIL.Image.open(fp, mode='r') 似乎它也接受文件指针
    猜你喜欢
    • 2017-10-18
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2012-10-25
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多