Джанго Подушка, сохранить изображение, как JPEG, кажется, не работает - PullRequest
0 голосов
/ 12 октября 2018

Goodmorning,

Я использую подушку, чтобы изменить размер и сохранить изображение в модели Django под названием Post.Изображение извлекается из поля изображения, проверяется, является ли оно RGB или нет, если изображение не преобразуется в RGB.

Наконец, я создаю миниатюру из исходного изображения и пытаюсьсохраните это в MEDIA_ROOT.

Несмотря на то, что изображение загружено, оно, похоже, не преобразует изображение в jpeg.

Я следовал этому уроку Django 2+ редактировать изображенияс подушкой и я пытаюсь подогнать ее под свои нужды.

Что мне здесь не хватает?

models.py

import os

from django.core.validators import RegexValidator
from django.db import models
from django.utils import timezone
from PIL import Image
from django.conf import settings
from django.db.models.signals import post_save
class Post(models.Model):

# Custom validators
title_validator_specialchar = RegexValidator(regex=r'^[\s*\d*a-zA-Z]{5,60}$', message="The title can't contain any special characters")

category = models.ForeignKey('Category',default=1, on_delete=models.SET_NULL, null=True)
type = models.CharField(max_length=20)
title = models.CharField(max_length=200, validators=[title_validator_specialchar])
content = models.TextField(max_length=2000)
image = models.ImageField(upload_to='%Y/%m/%d/', blank=True)
created_at = models.DateTimeField(editable=False)
updated_at = models.DateTimeField(default=timezone.now)

def save(self, *args, **kwargs):
    #On save, update timestamp date created
    if not self.id:
        self.created_at = timezone.now()
    self.updated_at = timezone.now()
    return super(Post, self).save(*args, **kwargs)

def __str__(self):
    return self.title


def resize_image(instance, **kwargs):

if instance.image:

    # we are opening image with Pillow
    img = Image.open(instance.image)

    # convert image to RGB
    if img.mode not in ('L', 'RGB'):
        img = img.convert('RGB')

    # img.size is tuple with values (width, height)
    if img.size[0] > 320 or img.size[1] > 640:

        # Using thumbnail to resize image but keep aspect ratio
        img.thumbnail((320, 640), Image.ANTIALIAS)

        # saving to original place
        # instance.image.name is in %Y/%m/%d/<name> format
        output = os.path.join(settings.MEDIA_ROOT, instance.image.name)
        img.save(output, "JPEG")

# Connect the signal with our model
post_save.connect(resize_image, Post)

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Так как я не мог найти то, что мне нужно, чтобы заставить это работать, я решил использовать django-imagekit.

Я использую ProcessedImageField и процессор ResizeToFill на моей модели;

models.py

image = ProcessedImageField(upload_to='%Y/%m/%d/', processors=[ResizeToFill(384, 216)], format='JPEG', options={'quality': 60}, blank=True)
0 голосов
/ 12 октября 2018

Обработчик сигнала получает отправителя в качестве первого аргумента, который в случае сигнала post_save является классом модели, а не экземпляром модели.

Таким образом, аргумент instance из resize_image() должениметь имя sender и не содержит того, что вы хотите.Вот как вы получаете фактический экземпляр:

def resize_image(sender, **kwargs):
    instance = kwargs.get('instance')
    if instance and instance.image:
        ...
...