django创建自定义表单

时间:2017-01-31 21:19:28

标签: python django forms django-forms

我们可以通过继承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中创建动态表单而无需编写类定义?

1 个答案:

答案 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)