【问题标题】:Disable image-cleanup in Django在 Django 中禁用图像清理
【发布时间】:2021-10-31 10:16:44
【问题描述】:

我为用户创建了一些徽章。我使用django-CleanUp 删除其他媒体对象。当用户的分数足够高时,我想将旧徽章更改为新徽章。但是当更换图像时,旧图像(徽章)被删除。我不想要这个。我想保留旧徽章,因为其他用户仍在使用

我的观点:

def liked_post(request, pk):
    user_update = get_object_or_404(UserRanks, user = post.username)
        
    if  user_update.score < 50:
          user_update.rank_image = "guard.gif"

    elif user_update.score < 100:
           user_update.rank_image = "captain1.gif"

    elif user_update.score < 300:
           user_update.rank_image = "knight1.gif"
    user_update.save()

我的模特:

class UserRanks(models.Model):
   user = models.OneToOneField(User, on_delete=models.CASCADE)
   rank_image = models.ImageField(
        verbose_name="Rank Gif", default="guard.gif", null=True, blank=True)
   score = models.IntegerField(
        null=True, blank=True, verbose_name="Score", default=0)

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

有没有办法在不删除 django-clean-up 的情况下保留旧图像?

【问题讨论】:

  • 发布了一个答案来解释我在之前的评论中的意思。

标签: python html django django-models


【解决方案1】:

您不必为每个用户的同一个徽章创建单独的媒体项目。将徽章图像保存在静态存储(而不是媒体)中,并且只需一个返回正确图像 URL 的模型方法:

from django.templatetags.static import static

class UserRanks(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    score = models.IntegerField(
                null=True, blank=True, verbose_name="Score", default=0)
    # Delete "rank_image" column

    @property
    def rank_image_url(self):
        if self.score < 50:
            return static("image/guard.gif")
        elif user_update.score < 100:
            return static("image/captain1.gif")
        elif user_update.score < 300:
            return static("image/knight1.gif")

同时从您的视图中删除更新rank_image 的代码。然后简单地使用类似的东西

<img src="{{ user.userranks.rank_image_url }}" />

在您的模板中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2016-12-29
    • 2016-07-23
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 2013-11-07
    相关资源
    最近更新 更多