0

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

表格.py

class ListForm(ModelForm):   

    class Meta():
        model = protocol

        fields = []

视图.py

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

1 回答 1

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__方法并传入字段。我们包括所有字段并删除我们不需要的字段。

表格.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)

视图.py

newProtocol = protocol()
form = ListForm(instance=newProtocol, visible_fields=newProtocol.visiblefields())
于 2021-02-16T10:04:20.303 回答