ImageField не удалит файл при использовании os.unlink () - PullRequest
0 голосов
/ 01 мая 2011

У меня есть эта модель:

class UserProfile(models.Model):
    """(UserProfile description)"""
    user = models.ForeignKey(User)
    image = models.ImageField(upload_to=upload_to)

    def save(self):
        os.unlink(self.image.path)
        super(UserProfile, self).save()

Сценарий не выполняется по методу unlink() и сообщает, что файл не найден.Любые идеи?

Ошибка говорит

(2, «Нет такого файла или каталога»)

1 Ответ

2 голосов
/ 01 мая 2011

Вам нужна более конкретная отладка.Кроме того, то, как вы написали код, вероятно, гарантирует, что ошибки произойдут.Я не совсем уверен, но я не удивлюсь, если значение UserProfile.image не будет установлено до создания записи UserProfile.

Поэтому я бы переписал ваш код следующим образом:

class UserProfile(models.Model):
    user = models.ForeignKey(User)
    image = models.ImageField(upload_to=upload_to)

    def save(self):
        if self.image.path:
            try:
                os.unlink(self.image.path)
            except Exception, inst:
                raise Exception("Unable to delete %s. Error: %s" % (self.image.path, inst))
        super(UserProfile, self).save()

Обновление

Теперь, когда я думаю об этом, имеет смысл, что после того, как вы вызываете save, новая информация уже находится в self.image.Если ваша цель - удалить старые изображения при сохранении новых, вам нужно будет использовать сигнал pre_save в Django , чтобы извлечь старую запись (и, следовательно, старый путь к изображению) prior для сохранения изображения.Теоретически, вы могли бы поместить это в метод save модели UserProfile, но, поскольку он предназначен как побочное действие, которое напрямую не влияет на текущую запись , яоставим это отдельно.

Вот пример реализации:

from django.db.models import signals
def delete_old_image(sender, instance, using=None):
    try:
        old_record = sender.objects.get(pk=instance.pk)
        os.unlink(old_record.image.path)
    except sender.DoesNotExist:
        pass
signals.pre_save.connect(delete_old_image, sender=UserProfile)

Вы поместите это в файл models.py.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...