Загрузка файла в папку, значение которой выбирается из списка вариантов

У меня есть следующая модель Script :

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

Я хочу загрузить скрипт в значение атрибута folder, выбранного пользователем через список вариантов.

При upload_to=f'scripts/{folder}' он пытается загрузить его в media\scripts\<django.db.models.fields.CharField> что явно не то, что я хочу. Я видел кучу людей, использующих функцию get_folder_display(), но, похоже, она не работает в моделях, или я сделал это неправильно.

Как я могу получить значение папки, выбранной пользователем?

Вы можете передать функцию в upload_to, эта функция получает instance и filename и должна вернуть нужный путь, включая имя файла.

Поскольку функции будет передан экземпляр, вы можете получить 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 для поля папки

Вернуться на верх