0

我有这个模型:

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, '没有这样的文件或目录')

4

1 回答 1

2

您需要更具体的调试。此外,您编写代码的方式可能会确保发生错误。我不完全确定,但如果在创建 UserProfile 记录之前未设置 UserProfile.image 的值,我不会感到惊讶。

所以我会重写你的代码:

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 中,这确实是有道理的。如果您的目标是在保存新图像时删除旧图像,则需要在保存图像之前使用Django 中的 pre_save 信号来检索旧记录(以及旧图像路径)。从理论上讲,您可以将其放入模型的方法中,但由于它的目的是作为不直接影响当前记录的附带操作,因此我会将其分开。saveUserProfile

这是一个示例实现:

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文件中。

于 2011-05-01T16:50:26.263 回答