簡體   English   中英

使用 Django 管理模型保存之前更改上傳的圖像

[英]Alter uploaded image before saving with Django admin models

我有一個 Django model 可以保存圖像。 但是,在我保存 model 之前,我想檢查寬度和高度並創建圖像的 md5 hash 以檢查重復上傳。

我沒有使用任何自定義 forms 我只是想使用管理后端上傳一些圖像。

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

這是我的 model:

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)

但是,我在任何地方都找不到如何訪問以表單發送的文件。 我怎樣才能訪問這些?

像這樣,

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操作是否正在處理新的 object

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM