我们可以通过继承forms.Form直接创建一个简单的表单。但是,我希望根据admin指定的键值动态创建表单。考虑一下,用户提供的地图为:
[
{
"key": "name",
"value": "CharField"
},
{
"key": "url",
"value": "URLField"
}
]
根据上面给出的地图,我如何创建一个与下面基于类的表单创建等效的表单:
from django import forms
class CommentForm(forms.Form):
name = forms.CharField(label='name')
url = forms.URLField(label='url')
我当前的方法可能是遍历每个键值对并手动创建HTML表单。是否可以在django中创建动态表单而无需编写类定义?
答案 0 :(得分:1)
是的,您可以在表单的 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)