Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除条目后从服务器中删除文件_Python_Django_Django Models - Fatal编程技术网

Python 删除条目后从服务器中删除文件

Python 删除条目后从服务器中删除文件,python,django,django-models,Python,Django,Django Models,我在django中创建了一个基本文件应用程序,这样客户端就可以上传文件、复制相对url并在网站内容中使用它。该应用程序的一个想法是,一旦一个条目被删除,文件将从服务器上删除,以帮助清理空间并保持服务器整洁 但是,当我添加条目(文件)时,它会上载到正确的目录。但是,当我删除它时,文件仍保留在服务器上。是否有一种方法可以删除文件以及条目(文件) 代码如下: from django.db import models def get_upload_to(instance, filename):

我在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)

谢谢

只需覆盖模型
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\u 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)

希望有帮助

您是在
os.remove
之后检索条目的文件系统路径吗?可能对我来说比较新,所以您必须详细说明,抱歉!我认为它类似于.remove(),但不确定如何定位上传的文件。你能发布一下你是如何处理删除的吗?有很多方法可以删除文件,这是一个:至于如何“目标上传的文件”你问它有什么目录/文件名?厚颜无耻的回答:它就在你保存它的地方。这取决于PUT/POST处理程序的工作方式。@AdrianRatnapala:django事务的工作方式是,更安全的方法是使用cronjob来删除某个年龄段以上的孤立文件。我曾尝试过类似的操作,但没有成功。为什么不呢?发生了什么?什么都没有,没有引起任何错误。正常上传文件。然后,当我删除条目时,文件仍保留在文件夹中。执行一些调试以查看代码是否正常工作,例如,在delete方法中引发异常并查看是否引发异常。您可能还希望使用
post_delete
信号处理程序,该处理程序将同时适用于单实例删除和批量删除。