【问题标题】:how to prevent from resize the image with every save object in dadtabase?如何防止表格用数据库中的每个保存对象调整图像大小?
【发布时间】:2022-10-24 20:31:26
【问题描述】:

我有这个模型:

class Book(models.Model):
   title = models.CharField(max_length=256)
   price = models.IntegerField()
   category = models.ForeignKey('Category', on_delete=models.PROTECT)
   rating = models.FloatField(validators=[MaxValueValidator(10), MinValueValidator(1)])
   discount = models.IntegerField(blank=True, default=0)
   final_price = models.IntegerField(blank=True)
   created_date = models.DateTimeField(auto_now_add=True)
   description = models.TextField(blank=True, null=True)
   count = models.IntegerField(default=0)
   author = models.ForeignKey('Author', on_delete=models.PROTECT)
   image = models.ImageField(upload_to=_get_product_cover_upload_path, null=True, blank=True)

   def resize_image(self):
       img = Image.open(self.image.path)
       img.thumbnail((300, 300))
       img_w, img_h = img.size
       background = Image.new('RGBA', (400, 400), (255, 255, 255, 255))
       bg_w, bg_h = background.size
       offset = ((bg_w - img_w) // 2, (bg_h - img_h) // 2)
       background.paste(img, offset)
       background.save(self.image.path)

   def __str__(self):
       return f'{self.title}'

   def save(self, *args, **kwargs):
       self.final_price = self.price * (100 - self.discount) / 100

       super().save(*args, **kwargs)
       self.resize_image()

它运作良好,但是当我修改书籍模型(例如更改价格)时,图像会变得比上次更小,并且每次保存对象都会变得更小...... 我该如何解决?

【问题讨论】:

    标签: django django-models django-views django-templates


    【解决方案1】:

    您应该有一个“original_image”字段和一个“thumbnail_image”字段。

    当你保存你的 original_image,调整它的大小,并将其保存到 thumbnail_image:

    class Book(models.Model):
        title = models.CharField(max_length=256)
        price = models.IntegerField()
        category = models.ForeignKey('Category', on_delete=models.PROTECT)
        rating = models.FloatField(validators=[MaxValueValidator(10), MinValueValidator(1)])
        discount = models.IntegerField(blank=True, default=0)
        final_price = models.IntegerField(blank=True)
        created_date = models.DateTimeField(auto_now_add=True)
        description = models.TextField(blank=True, null=True)
        count = models.IntegerField(default=0)
        author = models.ForeignKey('Author', on_delete=models.PROTECT)
        original_image = models.ImageField(upload_to=_get_product_cover_upload_path, null=True, blank=True)
        thumbnail_image = models.ImageField(upload_to=_get_product_cover_upload_path, null=True, blank=True)
    
        def resize_image(self):
            img = Image.open(self.original_image.path)
            img.thumbnail((300, 300))
            img_w, img_h = img.size
            background = Image.new('RGBA', (400, 400), (255, 255, 255, 255))
            bg_w, bg_h = background.size
            offset = ((bg_w - img_w) // 2, (bg_h - img_h) // 2)
            background.paste(img, offset)
            background.save(self.thumbnail_image.path)
    
        def __str__(self):
            return f'{self.title}'
    
        def save(self, *args, **kwargs):
            self.final_price = self.price * (100 - self.discount) / 100
    
            super().save(*args, **kwargs)
            if not self.thumbnail_image:
                self.resize_image()
    

    【讨论】:

      猜你喜欢
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 2011-01-29
      相关资源
      最近更新 更多