Отключите очистку изображений в 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?
Вам не нужно создавать отдельный медиа элемент для одного и того же бейджа для каждого пользователя. Храните изображения бейджей в статическом хранилище (не в медиа) и просто имейте метод модели, который возвращает 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 }}" />
в ваших шаблонах.