我正在尝试使用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字段小部件。 任何人都知道我做错了什么?
答案 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:]]