上传文件夹中的文件,其值是通过选项列表选择的
Upload a file in a folder whose value is selected through a list of choices
我有以下脚本模型:
from django.db import models
import os
def getListOfFiles(dirName):
listOfFile = os.listdir(dirName)
allFiles = list()
for entry in listOfFile:
fullPath = os.path.join(dirName, entry)
if os.path.isdir(fullPath):
allFiles.append((fullPath, entry))
return allFiles
class Script(models.Model):
script_name = models.CharField(max_length=200, blank=True)
folder = models.CharField(choices=getListOfFiles('media/scripts'), max_length=200)
file = models.FileField(upload_to=f'scripts/{folder}')
def __str__(self):
return self.script_name
我想将脚本上传到用户通过选择列表选择的文件夹属性的值。
使用 upload_to=f'scripts/{folder}'
它尝试将其上传到 media\scripts\ 这显然不是我想要的。我看到很多人在使用 get_folder_display()
函数,但在模型中似乎不起作用,或者我做错了。
如何获取用户选择的文件夹的值?
您可以将函数传递给 upload_to,此函数接收 instance
和 filename
并且必须 return 包含文件名的所需路径。
由于函数将传递实例,您可以获得 folder
属性
def script_upload_path(instance, filename):
return f'scripts/{instance.folder}/{filename}'
class Script(models.Model):
script_name = models.CharField(max_length=200, blank=True)
folder = models.CharField(choices=getListOfFiles('media/scripts'), max_length=200)
file = models.FileField(upload_to=script_upload_path)
您可以考虑在文件夹字段中使用 FilePathField
我有以下脚本模型:
from django.db import models
import os
def getListOfFiles(dirName):
listOfFile = os.listdir(dirName)
allFiles = list()
for entry in listOfFile:
fullPath = os.path.join(dirName, entry)
if os.path.isdir(fullPath):
allFiles.append((fullPath, entry))
return allFiles
class Script(models.Model):
script_name = models.CharField(max_length=200, blank=True)
folder = models.CharField(choices=getListOfFiles('media/scripts'), max_length=200)
file = models.FileField(upload_to=f'scripts/{folder}')
def __str__(self):
return self.script_name
我想将脚本上传到用户通过选择列表选择的文件夹属性的值。
使用 upload_to=f'scripts/{folder}'
它尝试将其上传到 media\scripts\get_folder_display()
函数,但在模型中似乎不起作用,或者我做错了。
如何获取用户选择的文件夹的值?
您可以将函数传递给 upload_to,此函数接收 instance
和 filename
并且必须 return 包含文件名的所需路径。
由于函数将传递实例,您可以获得 folder
属性
def script_upload_path(instance, filename):
return f'scripts/{instance.folder}/{filename}'
class Script(models.Model):
script_name = models.CharField(max_length=200, blank=True)
folder = models.CharField(choices=getListOfFiles('media/scripts'), max_length=200)
file = models.FileField(upload_to=script_upload_path)
您可以考虑在文件夹字段中使用 FilePathField