Django的模型/的ModelForm - 如何获得动态选择在choiceField?(djan

2019-07-05 06:45发布

我与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())

它似乎没有work.What我的意思是Django的不想用我的小部件,而是呈现默认的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 = forms.ChoiceField(选择= {一些名单})

它仍然会使默认的字符字段部件。 谁知道我做错了吗?

Answer 1:

耶解决。 打我的头一整天,人们通过各种实例会后我得到这个工作。

基本上,我曾与#2正确的观念。 步骤如下
- 创建我们的模型的的ModelForm - 覆盖了models.CharField默认的表单字段的用户。 也就是说,我们要explcitly说使用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


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


文章来源: django model/modelForm - How to get dynamic choices in choiceField?