首页 > 解决方案 > 在 Django 中禁用图像清理

问题描述

我为用户创建了一些徽章。我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 的情况下保留旧图像?

标签: pythonhtmldjangodjango-models

解决方案


您不必为每个用户为相同的徽章创建单独的媒体项目。将徽章图像保存在静态存储(而不是媒体)中,并且只需一个返回正确图像 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 }}" />

在您的模板中。


推荐阅读