上传文件夹中的文件,其值是通过选项列表选择的

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,此函数接收 instancefilename 并且必须 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