django model / modelForm - 如何在choiceField中获得动态选择?

时间:2009-09-07 03:24:53

标签: django-models drop-down-menu django-admin django-forms

我正在尝试使用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)

然后我在我的modelForm中做了这个

class test1Form(ModelForm):
    test_folder_ddl  = forms.CharField(widget=FolderListDropDown())

它似乎没有用。我的意思是django不想使用我的小部件,而是渲染你使用CharField时得到的默认textinput。

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(choices = {some list})

它仍然会呈现默认的char字段小部件。  任何人都知道我做错了什么?

2 个答案:

答案 0 :(得分:15)

Yay解决了。在整天打我的脑袋并经过各种各样的例子后,我得到了这个工作。

基本上我对#2有正确的想法。步骤是
- 创建我们模型的ModelForm - 覆盖models.CharField的默认表单字段用户。即我们想要明确地说使用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

答案 1 :(得分: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:]]