gpt4 book ai didi

python - 动态添加表单字段到django表单

转载 作者:太空狗 更新时间:2023-10-29 21:37:05 26 4
gpt4 key购买 nike

由于 BD 设计取决于一个值,数据存储在不同的单元格中,我必须动态添加表单字段。我在想这个:

class EditFlatForm(BaseModelForm):


on_sale = forms.BooleanField(required=False)
on_rent = forms.BooleanField(required=False)


class Meta:

model = Flat

fields = ('title', 'flat_category', 'description')

...


def __init__(self, *args, **kwargs):

super(EditFlatForm, self).__init__(*args,**kwargs)


flat_properties = FlatProperty.objects.all()

for p in flat_properties:

if p.type_value == 1:
# Text
setattr(self, p.title, forms.CharField(label=p.human_title, required=False))
elif p.type_value == 2:
# Number
setattr(self, p.title, forms.IntegerField(label=p.human_title, required=False))
else:
# Boolean
setattr(self, p.title, forms.BooleanField(label=p.human_title, required=False))

但是字段没有被添加,我错过了什么?

最佳答案

我建议使用 type 即时创建表单。因此,您需要创建一个函数来生成您想要在表单中包含的所有字段的列表,然后使用它们来生成表单,如下所示:

def get_form_class():
flat_properties = FlatProperty.objects.all()
form_fields = {}
for p in flat_properties:
if p.type_value == 1:
form_fields['field_{0}'.format(p.id)] = django.forms.CharField(...)
elif p.type_value == 2:
form_fields['field_{0}'.format(p.id)] = django.forms.IntegerField(...)
else:
form_fields['field_{0}'.format(p.id)] = django.forms.BooleanField(...)
# ok now form_fields has all the fields for our form
return type('DynamicForm', (django.forms.Form,), form_fields )

例如,现在您可以在任何您想使用表单的地方使用 get_form_class

form_class = get_form_class()
form = form_class(request.GET)
if form.is_valid() # etc

有关更多信息,您可以查看我关于使用 Django 创建动态表单的帖子: http://spapas.github.io/2013/12/24/django-dynamic-forms/

更新 以解决 OP 的评论(但是如何利用 ModelForm 提供的所有功能?):您可以从 ModelForm 继承您的动态表单。或者,更好的是,您可以创建一个 ModelForm 的后代类,并定义所有必需的方法和属性(如 clean__init__Meta 等)。然后通过将 type 调用更改为 type('DynamicForm', (CustomForm,), form_fields ) 来继承该类!

关于python - 动态添加表单字段到django表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27504159/

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