Python 如何在WTForms中生成动态字段

Python 如何在WTForms中生成动态字段,python,flask,wtforms,Python,Flask,Wtforms,我正试图根据本文档在WTForms中生成一个具有动态字段的表单 我有一个子表单类,允许用户从列表中选择要购买的项目: class Item(Form): itmid = SelectField('Item ID') qty = IntegerField('Quantity') class F(Form): pass 将有多个类别的购物项目,因此我想根据用户将选择的类别生成一个动态选择字段: fld = FieldList(FormField(Item)) fl

我正试图根据本文档在WTForms中生成一个具有动态字段的表单

我有一个子表单类,允许用户从列表中选择要购买的项目:

class Item(Form):
    itmid = SelectField('Item ID')
    qty = IntegerField('Quantity')

class F(Form):
        pass
将有多个类别的购物项目,因此我想根据用户将选择的类别生成一个动态选择字段:

fld = FieldList(FormField(Item))
fld.append_entry()
但我得到了以下错误:

AttributeError: 'UnboundField' object has no attribute 'append_entry'

我是做错了什么,还是没有办法在工作中做到这一点

在没有编写完整代码或测试代码的情况下发布,但它可能会给你一些想法。此外,这可能只会有助于填充所需的数据

您需要为
SelectField
填写
choices
,以便能够查看数据并进行选择。你在哪里填的?初始填充应该在表单定义中,但如果您喜欢动态填充,我建议您在创建此表单的位置对其进行修改,以便向用户显示。像这样的视图,您可以执行一些
form=YourForm()
,然后将其传递给模板

如何用选项填充表单的选择字段?必须有元组列表,然后是类似以下内容:

form.category_select.choices = [(key, categories[key]) for key in categories]
form.category_select.choices.insert(0, ("", "Some default value..."))
categories
这里必须有一本字典,包含您的类别,格式类似于
{1:'One',2:'Two',…}

因此,如果您在定义表单时将某些内容分配给选项,那么它将从一开始就具有该数据,并且在需要用户类别的位置,只需在视图中覆盖它即可


希望这会给你一些想法,你可以继续前进:)

我今晚偶然遇到了这个问题,最后得出了这个结论。我希望这能帮助未来的人们

RecipeForm.py views.py 我觉得这也很有帮助

class BaseForm(Form):
    @classmethod
    def append_field(cls, name, field):
        setattr(cls, name, field)
        return cls

from forms import TestForm
form = TestForm.append_field("do_you_want_fries_with_that",BooleanField('fries'))(obj=db_populate_object)
我对所有表单使用扩展类BaseForm,并且在类上有一个方便的append\u字段函数


返回附加了字段的类,因为(表单字段的)实例不能附加字段。

是否尝试在表单实例上调用
append\u entry()
,而不是在字段列表定义上

class F(Form)
  fld = FieldList(SelectField(Item))

form = F()
form.fld.append_entry()

选择具有动态选择值的字段:

class UserDetails(Form):
    group_id = SelectField(u'Group', coerce=int)

def edit_user(request, id):
    user = User.query.get(id)
    form = UserDetails(request.POST, obj=user)
    form.group_id.choices = [(g.id, g.name) for g in Group.query.order_by('name')]

我就是这样让它工作的

class MyForm(FlaskForm):
    mylist = SelectField('Select Field', choices=[])

@app.route("/test", methods=['GET', 'POST']
def testview():
    form = MyForm()
    form.mylist.choices = [(str(i), i) for i in range(9)]

奇怪的是,如果我使用
强制=int
,这整件事对我就不起作用了。我自己是一个
flask
初学者,所以我不确定为什么
improve=int
会引起这个问题。

谢谢@ignas-b,但这只会用值填充Select字段,并不能解决我遇到的错误。是的。。。当我发布答案时,我重新阅读了问题和答案,并添加了“这可能只会有助于填写所需的数据。”…:)哦,好的:)你能在你使用
fld
的时候发布更多的代码吗?理想情况下,它将是一个表单类的属性,如文档中的示例所示:这将就地修改表单类。不要对共享的类使用此选项。考虑创建一个新的子类来代替:<代码>返回类型(CLS.Y.NAMEYSY,(CLS),{No:field Re})< /代码>。
class UserDetails(Form):
    group_id = SelectField(u'Group', coerce=int)

def edit_user(request, id):
    user = User.query.get(id)
    form = UserDetails(request.POST, obj=user)
    form.group_id.choices = [(g.id, g.name) for g in Group.query.order_by('name')]
class MyForm(FlaskForm):
    mylist = SelectField('Select Field', choices=[])

@app.route("/test", methods=['GET', 'POST']
def testview():
    form = MyForm()
    form.mylist.choices = [(str(i), i) for i in range(9)]