基于Python数据库查询的动态类(Django)

时间:2011-12-19 03:35:52

标签: python django django-forms metaprogramming

我想在Django中做这样的事情:

class MyForm(forms.Form):
     items = Items.objects.all()
     for item in items:
         # How does this part work?
         exec(item.name) = forms.BooleanField()

目标是为数据库查询返回的每个项创建一个表单字段。因此,如果我从查询中返回十个项目,那么该类将包含十个变量,每个变量以返回的项目命名。

这似乎在理论上是可行的,但这里有一些危险吗?数据库中的项目不是用户生成的。

2 个答案:

答案 0 :(得分:2)

您可以随意动态修改表单:

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
         super(MyForm, self).__init__(*args, **kwargs)
         for item in Item.objects.all():
              self.fields[item.name] = forms.BooleanField()

我认为危险在于,如果用户提交表单时数据库状态发生了变化,新表单会使用上一个表单没有的新字段进行初始化。

答案 1 :(得分:0)

如果我是你,我会使用django formsets。

为什么formsets不是这里的选项?