Загрузка файла в папку, значение которой выбирается из списка вариантов
У меня есть следующая модель 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 для поля папки