Вам нужна более конкретная отладка.Кроме того, то, как вы написали код, вероятно, гарантирует, что ошибки произойдут.Я не совсем уверен, но я не удивлюсь, если значение 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
.