我们可以通过继承forms.Form直接创建一个简单的表单。但是,我希望根据管理员指定的键值动态创建表单。考虑一下,用户将 map 提供为:
[
{
"key": "name",
"value": "CharField"
},
{
"key": "url",
"value": "URLField"
}
]
根据上面给出的 map ,我如何创建一个等同于下面基于类的表单创建的表单:
from django import forms
class CommentForm(forms.Form):
name = forms.CharField(label='name')
url = forms.URLField(label='url')
我目前的方法可能是遍历每个键值对并手动制作一个 HTML 表单。是否可以在 Django 中创建动态表单而无需编写类定义?
请您参考如下方法:
是的,您可以在表单的init 函数中执行此操作。
在创建表单时将映射数组作为额外的关键字参数传入,然后在调用 super 的 init 方法之前从 kwargs 中弹出它。
然后您可以使用它向表单动态添加字段。
class CommentForm(forms.Form):
def __init__(self , *args, **kwargs):
field_mapping_array = kwargs.pop('field_mapping_array')
super(CommentFrom, self).__init__(*args, **kwargs)
for field_type in field_mapping_array:
field_name = field_type['key'] # make sure keys are unique
if field_type[value] == "CharField":
self.fields[field_name] = form.CharField(...extra args here)
elif field_type['value'] == 'UrlField' :
self.fields[field_name] = form.UrlField(...extra args here)
elif .... map other field types here....
创建表单时将 field_mapping_array 传递到表单类中。
field_mapping = [
{
"key": "name",
"value": "CharField"
},
{
"key": "url",
"value": "URLField"
}
]
comment_form = CommentForm(field_mapping_array=field_mapping)
