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 に答える