【问题标题】:Is there a way to make a form dynamic in django有没有办法在 django 中使表单动态化
【发布时间】:2021-12-18 08:28:50
【问题描述】:

我正在尝试在管理面板中创建一个动态下拉列表。它应该显示来自某个模型的所有字段。

这是我的代码的 sn-p:

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

问题是,我需要从模型中返回字段。但是,当我将“值”作为 python 函数的参数传递时,它不会发送打印在console.log 上的 id。

控制台日志输出:

我想知道是否有办法让模型只在表单文件上动态化。

【问题讨论】:

  • 我认为你可以使用react/vue+djangorestframework 来做到这一点。

标签: javascript python django forms django-forms


【解决方案1】:

实现目标的一种方法是编写一个函数,该函数返回模型中字段的名称,以及所需的选项值。您可以使用forms.ChoiceField 并设置choices=getFields()。请记住,选择需要一个元组的元组,所以这是您必须从 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
 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-12
    • 2020-01-11
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    相关资源
    最近更新 更多