Есть ли способ сделать форму динамической в django

Я пытаюсь сделать динамический выпадающий список в панели администратора. Он должен показывать все поля из определенной модели.

Вот фрагмент моего кода:

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__"

Проблема в том, что мне нужно вернуть поля из модели. Однако, когда я передаю 'value' в качестве параметра для функции python, она не отправляет id, который выводится на console.log.

Вывод журнала консоли: enter image description here

Хотелось бы узнать, есть ли способ сделать модель динамической только в файле формы.

Один из способов достижения вашей цели - написать функцию, которая возвращает имена полей в вашей модели с желаемыми значениями опций. Вы можете использовать forms.ChoiceField и set choices=getFields(). Помните, что choices принимает кортеж кортежей, поэтому именно это значение вы должны вернуть из 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
 
Вернуться на верх