Подтвердить что ты не робот

Django model/modelForm - Как получить динамический выбор в выбореField?

Я экспериментирую с 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 по умолчанию.   Кто-нибудь знает, что я делаю неправильно?

4b9b3361

Ответ 1

Я решил. после того, как я весь день избивал свою голову и проходил всевозможные примеры людьми, я получил это, чтобы работать.

В принципе у меня была правильная идея С# 2. Этапы: - Создайте модельную модель нашей модели - переопределить пользователя поля формы по умолчанию для models.CharField. то есть мы хотим, чтобы яростно сказал, что используйте selectField.
- Затем мы должны переопределить способ создания экземпляра формы, чтобы мы назовем то, что хотим использовать для создания нашего динамического списка вариантов

- тогда в нашем 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

Ответ 2

Я использую генератор:

см. git://gist.github.com/1118279.git

    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:]]