【问题标题】:django create custom formdjango 创建自定义表单
【发布时间】:2017-06-17 11:39:41
【问题描述】:

我们可以通过继承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可以不用写类定义就可以创建动态表单吗?

【问题讨论】:

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

标签: python django forms django-forms


【解决方案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)   

【讨论】:

    猜你喜欢
    • 2018-09-10
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2019-07-11
    • 1970-01-01
    相关资源
    最近更新 更多