Python wtforms,在构造函数中生成字段
我需要在表单的构造函数中生成字段,因为所需字段的数量可能会有所不同。我认为我目前的解决方案就是这个问题。当我尝试在模板中展开表单时,会出现一个异常 AttributeError:“UnboundField”对象没有属性“调用” 这个代码有什么问题Python wtforms,在构造函数中生成字段,python,flask,wtforms,jinja2,Python,Flask,Wtforms,Jinja2,我需要在表单的构造函数中生成字段,因为所需字段的数量可能会有所不同。我认为我目前的解决方案就是这个问题。当我尝试在模板中展开表单时,会出现一个异常 AttributeError:“UnboundField”对象没有属性“调用” 这个代码有什么问题 class DriverTemplateSchedueForm(Form): def __init__(self, per_day=30, **kwargs): self.per_day = per_day ag
class DriverTemplateSchedueForm(Form):
def __init__(self, per_day=30, **kwargs):
self.per_day = per_day
ages = model.Agency.query.all()
ages = [(a.id, a.name) for a in ages]
self.days = [[[]] * per_day] * 7
for d in range(7):
for i in range(per_day):
lbl = 'item_' + str(d) + '_' + str(i)
self.__dict__[lbl] = SelectField(lbl, choices=ages)
self.days[d][i] = self.__dict__[lbl]
for day in self.days:
print(day)
Form.__init__(self, **kwargs)
修复
您需要将字段添加到类而不是实例:
为什么向self
添加字段不起作用?
WTForms使用元类将表单和字段注册在一起并保持顺序<代码>*字段实例是未绑定创建的,并绑定到类实例
在运行
DriverTemplateScheduleForm.\uuuu init\uuuu
时,\u unbound\u字段
已填充。你可以将你的字段放入self.\u unbound\u fields
中,事情也会正常进行,但这是在使用私有API,因此可能会在以后中断。关于元类的答案是正确的,但如果你真的需要它(像我一样):
请注意,我们并没有修改\u unbound\u fields
,以便下次在form类中不使用此字段
def driver_template_schedue_form(ages, per_day=30, **kwargs):
"""Dynamically creates a driver's schedule form"""
# First we create the base form
# Note that we are not adding any fields to it yet
class DriverTemplateScheduleForm(Form):
pass
# Then we iterate over our ranges
# and create a select field for each
# item_{d}_{i} in the set, setting each field
# *on our **class**.
for d in range(7):
for i in range(per_day):
label = 'item_{:d}_{:d}'.format(d, i)
field = SelectField(label, choices=ages)
setattr(DriverTemplateScheduleForm, label, field)
# Finally, we return the *instance* of the class
# We could also use a dictionary comprehension and then use
# `type` instead, if that seemed clearer. That is:
# type('DriverTemplateScheduleForm', Form, our_fields)(**kwargs)
return DriverTemplateScheduleForm(**kwargs)
class SomeForm(Form):
def __init__(self, *args, **kwargs):
for name in kwargs.keys():
if name.startswith('PREFIX_'):
field = HiddenField()
setattr(self, name, field)
self._unbound_fields = self._unbound_fields + [[name, field]]
super(SomeForm, self).__init__(*args, **kwargs)