Skip to main content
 首页 » 编程设计

python之django 创建自定义表单

2025年02月15日39cyq1162

我们可以通过继承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)