123

Django で Web アプリを作成しています。ファイルをアップロードするモデルがありますが、ファイルを削除できません。これが私のコードです:

class Song(models.Model):
    name = models.CharField(blank=True, max_length=100)
    author = models.ForeignKey(User, to_field='id', related_name="id_user2")
    song = models.FileField(upload_to='/songs/')
    image = models.ImageField(upload_to='/pictures/', blank=True)
    date_upload = models.DateField(auto_now_add=True)

    def delete(self, *args, **kwargs):
        # You have to prepare what you need before delete the model
        storage, path = self.song.storage, self.song.path
        # Delete the model before the file
        super(Song, self).delete(*args, **kwargs)
        # Delete the file after the model
        storage.delete(path)

次に、python manage.py shell私はこれを行います:

song = Song.objects.get(pk=1)
song.delete()

データベースからレコードを削除しますが、サーバー上のファイルは削除しません。他に何を試すことができますか?

ありがとう!

4

9 に答える 9

97

モデルを削除すると、 FileField の delete メソッドが自動的に呼び出されます

pip install django-cleanup

設定.py

INSTALLED_APPS = (
     ...
    'django_cleanup.apps.CleanupConfig',
)
于 2015-03-11T12:14:47.367 に答える
16

モデルの削除関数を単純に上書きして、ファイルが存在するかどうかを確認し、スーパー関数を呼び出す前に削除することもできます。

import os

class Excel(models.Model):
    upload_file = models.FileField(upload_to='/excels/', blank =True)   
    uploaded_on = models.DateTimeField(editable=False)


    def delete(self,*args,**kwargs):
        if os.path.isfile(self.upload_file.path):
            os.remove(self.upload_file.path)

        super(Excel, self).delete(*args,**kwargs)
于 2015-02-09T13:45:22.157 に答える
5

モデルが削除されるか新しいファイルがアップロードされるたびに古いファイルを削除するアプリを次に示します: django-smartfields

from django.db import models
from smartfields import fields

class Song(models.Model):
    song = fields.FileField(upload_to='/songs/')
    image = fields.ImageField(upload_to='/pictures/', blank=True)
于 2014-12-24T04:46:52.740 に答える
3

@アントン・ストロゴノフ

ファイルが変更されたときにコードに何かが欠けています。新しいファイルを作成するとエラーが発生します。これは、新しいファイルがパスを見つけられなかったためです。関数のコードを修正し、try/except 文を追加したところ、うまく機能しました。

@receiver(models.signals.pre_save, sender=MediaFile)
def auto_delete_file_on_change(sender, instance, **kwargs):
    """Deletes file from filesystem
    when corresponding `MediaFile` object is changed.
    """
    if not instance.pk:
        return False

    try:
        old_file = MediaFile.objects.get(pk=instance.pk).file
    except MediaFile.DoesNotExist:
        return False

    new_file = instance.file
    if not old_file == new_file:
        try:
            if os.path.isfile(old_file.path):
                os.remove(old_file.path)
        except Exception:
            return False
于 2013-10-09T21:05:51.953 に答える