Estoy tratando de hacer una lista desplegable dinámica en el Panel de administración. Debería mostrar todos los campos de un determinado modelo.
Aquí está el fragmento de mi código:
JS_FUNCTION = """ obj = document.getElementById('id_field_name'); for (let i = 0, len = test.length; i < len; i++) { var opt = document.createElement('option'); opt.value = test[i]; opt.innerHTML = test[i]; obj.appendChild(opt); } """ def set_queryset(value): # model = SyncModel.objects.get(id=value) # return model.get_fields() return ["a", "b", "c", "d"] class WhitelistForm(forms.ModelForm): sync_model = forms.ModelChoiceField( queryset=SyncModel.objects.all(), widget=forms.Select( attrs={ "onchange": f'console.log(value); var test = {set_queryset("value")}; {JS_FUNCTION}', "required": True, } ), ) field_name = forms.ChoiceField( choices=(), ) class Meta: model = WhitelistModel fields = "__all__" El problema es que necesito devolver los campos del modelo. Sin embargo, cuando paso el 'valor' como parámetro para la función python, no envía la identificación que está impresa en el console.log .
Salida de registro de la consola: 
Me gustaría saber si hay una forma de hacer que el modelo sea dinámico solo en el archivo de formulario.
Una forma de lograr su objetivo es escribir una función que devuelva los nombres de los campos en su modelo, con los valores deseados para las opciones. Podría usar un forms.ChoiceField y establecer choices=getFields() . Recuerde que las opciones toman una tupla de tuplas, por lo que eso es lo que debe devolver desde getFields() .
from app.model import myModel def getFields(): all_fields = myModel._meta.fields *Do something to extract the names in the format you want* *Create a list of vals to zip to the names* data = tuple(zip(vals, all_fields)) return data