estoy experimentando con django y la interfaz de administración integrada.django model/modelForm - ¿Cómo obtener opciones dinámicas en choiceField?
Básicamente quiero tener un campo desplegable en la interfaz de usuario del administrador. Las opciones desplegables deben ser todos los directorios disponibles en un directorio específico.
Si defino un campo como este:
test_folder_list = models.FilePathField(path=/some/file/path)
que me muestra todos los archivos en el directorio, pero no los directorios .
¿Alguien sabe cómo puedo mostrar las carpetas?
También probé haciendo
test_folder_list = models.charField(max_length=100, choices=SOME_LIST)
donde SOME_LIST es una lista que pueblan el uso de algún código personalizado para leer las carpetas de un directorio. Esto funciona pero no se actualiza. es decir, la lista de opciones está limitada a una instantánea de lo que estaba allí cuando se ejecuta la aplicación por primera vez.
gracias de antemano.
actualización:
después de algún pensamiento y la investigación descubrí lo que deseo puede ser que sea
1. crear mi propio widget que se basa en forms.ChoiceField
o
2. pasar mi lista de carpetas a la lista de opciones cuando se representa en el cliente
para 1. intenté un widget personalizado. mi modelo se parece
class Test1(models.Model):
test_folder_ddl = models.CharField(max_length=100)
entonces este es mi widget personalizado:
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)
luego hice esto en mi ModelForm
class test1Form(ModelForm):
test_folder_ddl = forms.CharField(widget=FolderListDropDown())
y no parecía work.What Quiero decir con esto es que django no quería usar mi widget y en su lugar representaba el textinput predeterminado que obtienes cuando usas un CharField.
para 2. he intentado esto en mi ModelForm
class test1Form(ModelForm):
test_folder_ddl = forms.CharField(widget=FolderListDropDown())
test_folder_ddl.choices = {some list}
También probé test1Form clase (ModelForm): test_folder_ddl = forms.ChoiceField (opciones = {} alguna lista)
y todavía representaría el widget de campo de char por defecto. ¿Alguien sabe lo que estoy haciendo mal?
impresionante, muchas gracias, esto funciona en Django 1.10, también. – Moritz