为什么我的 Django 模型不能正常工作?

Why does my Django Model not work correctly?

目前正在制作一个基本的 Django 项目,遵循 youtube 上的一个精心设计的教程。一切顺利,我通常尝试自己调试问题,如果我被卡住了,我不会问。

问题:

此代码旨在检查图像重新上传后的大小,然后将其格式化为正方形,但查看链接的图像时,情况并非如此。我的代码错了吗?还有其他检查和验证图像的方法吗?

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default="default.jpg", upload_to="profile_pics")

    def __str__(self):
        return f'{self.user.username} Profile'


    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

        img = Image.open(self.image.path)

        if img.height > 300 or img.width > 300:
            output_size = (300,300)
            img.thumbnail(output_size)
            img.save(self.image.path)

上下文参考截图

更新:

您好 Allan,尝试了您的解决方案,现在在上传图片时出现错误。

我提取了 save() 的最小代码:

from PIL import Image
img = Image.open('g8uf6.png')
output_size = (300,300)
img.thumbnail(output_size)
img.save('thumbnail.png')

并发现它创建了 300x162 的 thumbnail.png preserve the aspect of the image。你 link 结果的图片,而不是输入图像,我猜,所以它会表现出相同的(正确的)行为。如果你确实想要方形图片,那么先缩放原始图片:

output_size = (300,300)  
img = Image.open(g8uf6.png').resize(output_size)

您通常希望保留宽高比,尤其是人物照片。

def save(self, *args, **kwargs):
super().save(*args, **kwargs)
img_width = 300
img_height = 300
img = Image.open(self.image.path).resize((img_width, img_height))
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.image.path)