J'expérimente django et l'interface d'administration intégrée.django model/modelForm - Comment obtenir des choix dynamiques dans choiceField?
Je veux fondamentalement avoir un champ qui est une liste déroulante dans l'interface utilisateur d'administration. Les choix déroulants doivent être tous les répertoires disponibles dans un répertoire spécifié.
Si je définir un champ comme ceci:
test_folder_list = models.FilePathField(path=/some/file/path)
il me montre tous les fichiers dans le répertoire, mais pas les répertoires .
Est-ce que quelqu'un sait comment je peux afficher les dossiers?
aussi j'ai essayé de faire
test_folder_list = models.charField(max_length=100, choices=SOME_LIST)
où SOME_LIST est une liste i en utilisant POPULATE code personnalisé pour lire les dossiers dans un répertoire. Cela fonctionne mais il ne rafraîchit pas. c'est-à-dire que la liste de choix est limitée à un instantané de ce qui existait lors de l'exécution de l'application pour la première fois.
merci d'avance.
mise à jour:
j'ai découvert après une réflexion et à la recherche ce que je veux peut être soit
1. créer mon propre widget qui est basé sur forms.ChoiceField
ou
2. passer ma liste de dossiers à la liste de choix quand il est rendu au client
pour 1. j'ai essayé un widget personnalisé. mon modèle ressemble
class Test1(models.Model):
test_folder_ddl = models.CharField(max_length=100)
alors ceci est mon widget personnalisé:
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)
alors je l'ai fait dans mon ModelForm
class test1Form(ModelForm):
test_folder_ddl = forms.CharField(widget=FolderListDropDown())
et il ne semble pas work.What Je veux dire par là que django n'a pas voulu utiliser mon widget et a rendu le textinput par défaut lorsque vous utilisez un CharField.
pour 2. J'ai essayé dans mon ModelForm
class test1Form(ModelForm):
test_folder_ddl = forms.CharField(widget=FolderListDropDown())
test_folder_ddl.choices = {some list}
J'ai aussi essayé test1Form de classe (ModelForm): test_folder_ddl = forms.ChoiceField (choix = {liste} certains)
et il rendrait toujours le widget champ de caractères par défaut. Quelqu'un sait ce que je fais mal?
Impressionnant, merci beaucoup, cela fonctionne sur django 1.10, aussi. – Moritz