0

我在 django 中创建了一个基本文件应用程序,因此客户可以上传文件并复制相对 url 并在网站内容中使用它。该应用程序的一个想法是一旦删除了一个条目,该文件将从服务器中删除,以帮助清理空间并保持服务器整洁。

但是,当我添加一个条目(文件)时,它会上传到正确的目录。但是,当我删除它时,文件仍保留在服务器上。有没有办法可以删除文件以及条目(文件)。

这是代码:

from django.db import models

def get_upload_to(instance, filename):        
    if instance.file_type == 'Image':
        return "images/filesApp/%s" % filename
    elif instance.file_type == 'PDF':
        return "pdf/filesApp/%s" % filename

    return "filesApp/%s" % filename

class File(models.Model):
    title = models.CharField(max_length=400, help_text="Enter the title of the file, this will appear on the listings page")
    CATEGORY_CHOICES = (
        ('Image', 'Image'),
        ('PDF', 'PDF')
    )
    file_type = models.CharField(choices=CATEGORY_CHOICES, help_text="Please select a file type", max_length=200)
    file_upload = models.FileField(upload_to=get_upload_to)

谢谢!

4

1 回答 1

1

只需覆盖模型delete方法:

import os
class File(models.Model):
    title = models.CharField(max_length=400, help_text="Enter the title of the file, this will appear on the listings page")
    CATEGORY_CHOICES = (
        ('Image', 'Image'),
        ('PDF', 'PDF')
    )
    file_type = models.CharField(choices=CATEGORY_CHOICES, help_text="Please select a file type", max_length=200)
    file_upload = models.FileField(upload_to=get_upload_to)

    def delete(self, *args, **kwargs):
        path=self.file_upload.path
        os.remove(path)
        super(File,self).delete(*args, **kwargs)

这仅适用于删除实体,不适用于bulk_delete. 如果您想在管理视图中处理这些,您将必须创建一个默认的管理操作,如下所示:

from django.contrib import admin
from models import *


def delete_selected(modeladmin, request, queryset):
    for element in queryset:
        element.delete()
delete_selected.short_description = "Delete selected elements"

class FileAdmin(admin.ModelAdmin):
    model = File
    actions = [delete_selected]

    list_display = ('title', 'file_type')

admin.site.register(File, FileAdmin)

希望能帮助到你!

于 2013-05-13T16:29:02.817 回答