django model / modelForm - как получить динамический выбор в choiceField?
я экспериментирую с django и встроенным интерфейсом администратора.
Я в основном хочу иметь поле, которое является выпадающим в пользовательском интерфейсе администратора. В раскрывающемся списке должны быть указаны все каталоги, доступные в указанном каталоге.
Если я определяю такое поле:
test_folder_list = models.FilePathField(path=/some/file/path)
он показывает мне все файлы в Каталоге, но не каталоги.
кто-нибудь знает как я могу отобразить папки?
также я пробовал делать
test_folder_list = models.charField(max_length=100, choices=SOME_LIST)
где SOME_LIST-это список, который я заполняю, используя некоторый пользовательский код для чтения папок в каталоге. Это работает, но не обновляется. т. е. список выбора ограничен снимком того, что было при первом запуске приложения.
спасибо заранее.
обновление:
после некоторых размышлений и исследований я обнаружил, что я хочу быть либо
1. создайте свой собственный виджет, основанный на формах.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)
затем я сделал это в моей modelForm
class test1Form(ModelForm):
test_folder_ddl = forms.CharField(widget=FolderListDropDown())
и, похоже, это не сработало.Что я имею в виду Джанго не хотел использовать мой виджет и вместо этого отображал textinput по умолчанию, который вы получаете при использовании CharField.
на 2. Я пробовал это в моей ModelForm
class test1Form(ModelForm):
test_folder_ddl = forms.CharField(widget=FolderListDropDown())
test_folder_ddl.choices = {some list}
Я тоже пробовал класс test1Form (ModelForm): test_folder_ddl = формы.ChoiceField (choices={некоторый список})
и он по-прежнему будет отображать виджет поля char по умолчанию. кто-нибудь знает что я делаю неправильно?
2 ответов
Yay решено. после избиения моей головы весь день и прохождения всевозможных примеров людьми я получил это на работу.
в основном у меня была правильная идея с #2. Шаги
- Создайте ModelForm нашей модели
- переопределить пользователя поля формы по умолчанию для моделей.Чарфилд. то есть мы хотим прямо сказать, что используем choiceField.
- Затем мы должны переопределить, как создается экземпляр формы, чтобы мы называли вещь, которую мы хотим использовать для создания нашего динамического списка выбор
- тогда в нашем ModelAdmin убедитесь, что мы явно говорим администратору использовать нашу ModelForm
class Test1(models.Model):
test_folder_ddl = models.CharField(max_length=100)
class Test1Form(ModelForm):
test_folder_ddl = forms.choiceField()
def __init__(self, *args, **kwargs):
super(Test1Form, self).__init__(*args, **kwargs)
self.fields['test_folder_ddl'].choices = utility.get_folder_list()
class Test1Admin(admin.ModelAdmin):
form = Test1Form
Я использую генератор:
смотрите git://Гист.на GitHub.ком/1118279.ГИТ
import pysvn
class SVNChoices(DynamicChoice):
"""
Generate a choice from somes files in a svn repo
""""
SVNPATH = 'http://xxxxx.com/svn/project/trunk/choices/'
def generate(self):
def get_login( realm, username, may_save ):
return True, 'XXX', 'xxxxx', True
client = pysvn.Client()
client.callback_get_login = get_login
return [os.path.basename(sql[0].repos_path) for sql in client.list(self.SVNPATH)[1:]]