【问题标题】:Why does my Django Model not work correctly?为什么我的 Django 模型无法正常工作?
【发布时间】:2021-04-03 18:10:43
【问题描述】:

目前正在制作一个基本的 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,尝试了您的解决方案,现在在上传图片时出现错误。

【问题讨论】:

  • 链接的图像是 1920x1040,所以它应该触发 safe() 中的 if 语句。你在观察什么行为?您尝试过什么来解决问题?
  • 因此,当我尝试上传不是正方形的图像时,它会在显示时拉伸图像,而不是呈现为正方形。我已经为此尝试了几个灵魂,但没有鸟。注意:我在这些图像上的唯一样式是 boostrap 样式“class="rounded-circle""
  • 您的原始代码不会使图像变成正方形。我在下面分享的第二个 sn-p 代码告诉你如何做到这一点。如果这回答了您的问题,请将其标记为已解决。如果您需要前端方面的帮助,请打开一个新问题。

标签: python django django-models django-file-upload


【解决方案1】:

我提取了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。我猜你的链接是结果图片,而不是输入图像,所以它会展示相同的(正确的)行为。如果你确实想要一个方形图像,那么先缩放原图:

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

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

【讨论】:

  • 感谢 Allan,尝试添加此内容,但现在出现错误。
  • 您需要告诉我您遇到了什么错误,以便我帮助您。
【解决方案2】:
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)

【讨论】:

  • 这段代码解决了你原来的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 2021-04-04
  • 1970-01-01
  • 2021-12-30
  • 2020-06-27
  • 1970-01-01
相关资源
最近更新 更多