1. 程式人生 > 程式設計 >Django 刪除upload_to檔案的步驟

Django 刪除upload_to檔案的步驟

新版Django在admin後臺直接刪除一條資料時,file = models.FileField(upload_to=‘file')上傳的檔案並不會刪除,以下為解決方法:

在model.py加入:

from django.db.models.signals import pre_delete
from django.dispatch.dispatcher import receiver
@receiver(pre_delete,sender=AddDateModel)
def mymodel_delete(sender,instance,**kwargs):
  # Pass false so FileField doesn't save the model.
  instance.file.delete(False)

補充知識:django之重寫FileField欄位的儲存例項

重寫FileField欄位的儲存,以重新命名為例

settings.py新增配置

settings.py中末尾新增配置如下,指定指向的操作檔案中的類:

# 檔案上傳重寫
DEFAULT_FILE_STORAGE = "app.customfilefield.storage.FileStorage"

新增FileStorage

app應用下新增python包customfilefield,注意有init.py檔案,customfilefield下建立py檔案storage.py,檔案內容為:

storage.py

# -*-coding:utf-8 -*-
from django.core.files.storage import FileSystemStorage
from django.http import HttpResponse
from django.conf import settings
import os,time,random
from app import utils
 
class FileStorage(FileSystemStorage):
  def __init__(self,location=settings.MEDIA_ROOT,base_url=settings.MEDIA_URL):
    #初始化
    super(FileStorage,self).__init__(location,base_url)
 
  #重寫 _save方法
  def _save(self,name,content):
    #副檔名
    ext = os.path.splitext(name)[1]
    #檔案目錄
    d = os.path.dirname(name)
    # 定義檔名,原始檔名,避開系統定義的隨機字串追加,所以避開不用name欄位
    end = utils.find_last(str(content),".")
    filename = ""
    if end != -1:
      filename = str(content)[:end]
    # 定義檔名,年月日時分秒隨機數
    fn = time.strftime("%Y%m%d%H%M%S")
    fn = fn + "_%d" % random.randint(0,100)
    #重寫合成檔名
    name = os.path.join(d,filename + fn + ext)
    #呼叫父類方法
    return super(FileStorage,self)._save(name,content)

utils.py

# 獲取字串中指定字元最後一次出現的位置
def find_last(string,str):
  last_position=-1
  while True:
    position=string.find(str,last_position+1)
    if position==-1:
      return last_position
    last_position=position

如此,最後上傳的檔名為原檔名加上年月日時分秒加上0-100的隨機數儲存,效果如下:

Django 刪除upload_to檔案的步驟

以上這篇Django 刪除upload_to檔案的步驟就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。