如何动态设置 Django 模型的可见字段?
how to dynamically set visible fields of a django modelform?
我希望 ModelForm 的可见字段由其所构建的模型 class 的实例确定。
ModelForm 建立在模型 protocol
之上,该模型具有一个方法 (protocol.visiblefields()
),其中 returns 一个字符串数组,对应于要显示的字段。
forms.py
class ListForm(ModelForm):
class Meta():
model = protocol
fields = []
views.py
newProtocol = protocol()
form = ListForm(instance=newProtocol)
您有几个选项可以执行此操作,一个主要在视图中,另一个在表单中 __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())
我希望 ModelForm 的可见字段由其所构建的模型 class 的实例确定。
ModelForm 建立在模型 protocol
之上,该模型具有一个方法 (protocol.visiblefields()
),其中 returns 一个字符串数组,对应于要显示的字段。
forms.py
class ListForm(ModelForm):
class Meta():
model = protocol
fields = []
views.py
newProtocol = protocol()
form = ListForm(instance=newProtocol)
您有几个选项可以执行此操作,一个主要在视图中,另一个在表单中 __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())