Python django创建自定义表单

Python django创建自定义表单,python,django,forms,django-forms,Python,Django,Forms,Django Forms,我们可以通过继承forms.form直接创建一个简单的表单。但是,我希望表单根据管理员指定的键值动态创建。考虑一下,用户提供的地图如下: [ { "key": "name", "value": "CharField" }, { "key": "url", "value": "URLField" } ] 基于上面给出的映射,我如何创建一个与下面基于类的表单创建等效的表单: from django import forms class Comment

我们可以通过继承forms.form直接创建一个简单的表单。但是,我希望表单根据管理员指定的键值动态创建。考虑一下,用户提供的地图如下:

[
  {
    "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中创建动态表单而不必编写类定义?

是的,您可以在表单的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 = [
    {
        "key": "name",
        "value": "CharField"
     },
     {
       "key": "url",
       "value": "URLField"
     }
]
comment_form = CommentForm(field_mapping_array=field_mapping)   

您从哪里获得额外属性(
标签
选项
,等等)?现在,我们可以假设它的值为key。但是,我会根据地图添加元数据。