gpt4 book ai didi

表单中的 django 表单集/表单中的动态数组

转载 作者:行者123 更新时间:2023-12-04 12:50:43 24 4
gpt4 key购买 nike

我有一个具有完全不同 json 配置的平台。任何用户都可以创建一个完全不同的新 json 配置。因此我不能静态地建模。

我正在尝试为这些 json 配置制作动态表单。

一些 json 配置具有值或对象数组。在视觉上,我需要这些是带有“添加更多”按钮的输入列表。

我看到了 formsets是在 Django 表单中添加值数组的普遍接受的方式。 (我已经在使用 mysql,所以我无法切换到 postgres ArrayField)。然而,从 django 示例来看,多个表单集被单独初始化并传递到 View 中。

由于我的配置是动态的,我不知道要初始化哪些表单集,而且表单集和表单之间的字段顺序混合在一起。

例如我正在关注 this link并像这样动态创建我的表单类:

class FieldHandler():
def __init__(self, fields):
self.formfields = {}
for field in fields:
options = self.get_options(field)
f = getattr(self, "create_field_for_" +
field['type'])(field, options)
self.formfields[field['name']] = f

def get_options(self, field):
options = {}
options['label'] = field['name']
options['help_text'] = field.get("help_text", None)
options['required'] = bool(field.get("required", 0))
return options

def create_field_for_text(self, field, options):
options['max_length'] = int(field.get("max_length", "20"))
return django.forms.CharField(**options)

def create_field_for_number(self, field, options):
options['max_value'] = int(field.get("max_value", "999999999"))
options['min_value'] = int(field.get("min_value", "-999999999"))
return django.forms.IntegerField(**options)

# This does not work, formsets are not shown in the template
def create_field_for_array(self, field, options):
fh = FieldHandler(field['elements'])
form_class = type('DynamicForm', (django.forms.Form,), fh.formfields)
DynamicFormSet = formset_factory(form_class)
return DynamicFormSet(prefix=field['name'])

并在 View 中:
# arg to FieldHandler is an example config, it will be retrieved from db 
fh = FieldHandler([
{'type': 'text', 'label': 'position'},
{'type': 'array', 'label': 'calendar', 'elements': [
{'type': 'text', 'label': 'country'},
{'type': 'text', 'label': 'url'},
]},
{'type': 'number', 'label': 'maxSize'}
])
form_class = type('DynamicForm', (django.forms.Form,), fh.formfields)
form = form_class(request.POST or None)

如您所见,动态表单使用 position 的配置进行初始化。 , calendar 的数组元素和 maxSize field 。

我的问题是我的动态表单集根本没有显示在 View 中。如果我要分离表单集,我将不得不以某种方式将其插入原始表单中的某处,因此我不能只是遍历字段,并动态创建 form首先,然后动态创建 formsets从数组字段。

因此,我希望有一种方法可以动态创建这种类型的表单,其中表单中的某些字段是 formsets .

我该怎么做呢?或者我应该如何处理这个问题?

最佳答案

如果您想在 MySQL 中保存数组,您必须将其作为 JSON 进行,这是实现它的最佳方式。
由于您想保存客户端生成的表单,并可能在之后恢复它,因此我会执行以下操作:

import json
from django.db import models

class Forms(models.Model):
_forms = models.TextField(null=True)

def get_forms(self):
if self._forms:
return json.loads(self._forms)
return []

def set_forms(self, v):
if not v:
v = []
self._forms = json.dumps(v)

这样,当你在外面调用它时,它已经是 json 了,当你想保存它时,你将一个 json 传递给它。

关于表单中的 django 表单集/表单中的动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51374031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com