Я экспериментирую с django и встроенным интерфейсом администратора.
В основном я хочу иметь поле, которое является падением в пользовательском интерфейсе администратора. В раскрывающемся списке должны быть все каталоги, доступные в указанном каталоге.
Если я определяю такое поле:
test_folder_list = models.FilePathField(path=/some/file/path)
он показывает мне все файлы в каталоге, но не каталоги.
Кто-нибудь знает, как я могу отображать папки?
также я пробовал делать
test_folder_list = models.charField(max_length=100, choices=SOME_LIST)
где SOME_LIST - это список, который я заполняю, используя некоторый код для чтения папок в каталоге. Это работает, но не обновляется. то есть список выбора ограничен моментальным снимком того, что было при запуске приложения в первый раз.
заблаговременно.
обновление:
после некоторых размышлений и исследований я обнаружил, что я хочу, может быть, либо в
1. создайте свой собственный виджет, основанный на forms.ChoiceField
или
2. передайте мой список папок в список выбора, когда он отображается клиенту
для 1. Я попробовал собственный виджет. моя модель выглядит как
class Test1(models.Model):
test_folder_ddl = models.CharField(max_length=100)
то это мой пользовательский виджет:
class FolderListDropDown(forms.Select):
def __init__(self, attrs=None, target_path):
target_folder = '/some/file/path'
dir_contents = os.listdir(target_folder)
directories = []
for item in dir_contents:
if os.path.isdir(''.join((target_folder,item,))):
directories.append((item, item),)
folder_list = tuple(directories)
super(FolderListDropDown, self).__init__(attrs=attrs, choices=folder_list)
то я сделал это в моей модели Model
class test1Form(ModelForm):
test_folder_ddl = forms.CharField(widget=FolderListDropDown())
и, похоже, это не работает. Что я имею в виду, это то, что django не хочет использовать мой виджет и вместо этого отображает текстовую версию по умолчанию, которую вы получаете, когда используете CharField.
для 2. Я пробовал это в своей ModelForm
class test1Form(ModelForm):
test_folder_ddl = forms.CharField(widget=FolderListDropDown())
test_folder_ddl.choices = {some list}
Я также пробовал class test1Form (ModelForm): test_folder_ddl = forms.ChoiceField(choice = {some list})
и он по-прежнему будет отображать виджет поля char по умолчанию. Кто-нибудь знает, что я делаю неправильно?