Перед загрузкой измените загруженное изображение с помощью Django моделей администратора. - PullRequest
1 голос
/ 29 апреля 2020

У меня есть модель Django, которая сохраняет изображение. Однако прежде чем сохранить модель, я хочу проверить ширину и высоту и создать md5 га sh изображения для проверки на наличие дублирующих загрузок.

Я не использую никаких пользовательских форм, я просто пытаюсь чтобы загрузить некоторые изображения с помощью административного сервера.

Я использую 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)

Однако я нигде не могу найти, как я могу получить доступ к файлам, которые отправляются в форме. Как я могу получить к ним доступ?

1 Ответ

1 голос
/ 29 апреля 2020

Точно так же,

class UploadedImage(models.Model):
    # your code

    def save(self, *args, **kwargs):
        <b>if not self.pk:
            self.image  # the image will be here
            # access any class variables using `self` member</b>
        super(UploadedImage, self).save(*args, **kwargs)

здесь утверждение, if not self.pk очень важно, поскольку оно используется для определения того, обрабатывает ли операция save новый объект или нет

...