2009-09-07 57 views
10

我正在試驗Django和內置的管理界面。django model/modelForm - 如何在choiceField中獲得動態選擇?

我基本上想要在管理界面中有一個下拉字段。下拉選項應該是指定目錄中所有可用的目錄。
如果我定義一個字段是這樣的:

test_folder_list = models.FilePathField(path=/some/file/path) 

它顯示了我所有的目錄中的文件,但不是目錄

有誰知道我該如何顯示文件夾?

還我試圖做

test_folder_list = models.charField(max_length=100, choices=SOME_LIST) 

其中SOME_LIST是一個列表我填充使用一些自定義代碼來讀取一個目錄中的文件夾。這有效,但不刷新。即選擇列表僅限於第一次運行應用程序時的任何內容的快照。

在此先感謝。


更新:
經過一番思考和研究我發現了什麼,我想可能是要麼
創建基於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不想使用我的小部件,而是呈現您使用CharField時得到的默認textinput。

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(選擇= {一些名單})

它仍然會呈現默認的字段字段小部件。 任何人都知道我在做什麼錯了?

回答

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 
+0

真棒,太感謝你了,這個工程上的Django 1.10,太。 – Moritz

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