如何动态设置django模型表单的可见字段?

时间:2021-02-16 09:17:52

标签: django field modelform

我希望 ModelForm 的可见字段由构建它的模型类的实例确定。 ModelForm 建立在模型 protocol 之上,该模型具有一个方法 (protocol.visiblefields()),该方法返回与要使其可见的字段对应的字符串数组。

forms.py

class ListForm(ModelForm):   

    class Meta():
        model = protocol

        fields = []

views.py

newProtocol = protocol()
form = ListForm(instance=newProtocol)

1 个答案:

答案 0 :(得分:0)

您有多种选择可以执行此操作,一种主要在视图中,另一种采用 __init__ 形式。

选项 1: 在初始化表单后弹出字段。尽管您需要在 Meta 表单中指定所有字段并删除视图中不需要的字段。

newProtocol = protocol()
form = ListForm(instance=newProtocol)
visible_fields = newProtocol.visiblefields()
for field in form.fields:
    if field not in visible_fields:
        form.fields.pop(field)

选项 2: 覆盖 __init__ 方法并传入字段。我们包含所有字段并删除不需要的字段。

forms.py

class ListForm(ModelForm):   

    class Meta:
        model = protocol
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        visible_fields = kwargs.pop('visible_fields')
        super(ListForm, self).__init__(*args, **kwargs)
        for field in self.fields:
            if field not in visible_fields:
                self.fields.pop(field)

views.py

newProtocol = protocol()
form = ListForm(instance=newProtocol, visible_fields=newProtocol.visiblefields())
相关问题