如何在WTForms中生成动态字段

2024-05-15 21:29:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在WTForms中生成一个表单,该表单根据此文档具有动态字段http://wtforms.simplecodes.com/docs/1.0.2/specific_problems.html#dynamic-form-composition

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

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'

我是做错了什么,还是没有办法用WTForms来完成?


Tags: 项目用户文档formhttp表单动态item
3条回答

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

您需要填写choices,以便SelectField能够看到数据并能够选择它。你在哪儿装的?初始填充应该在表单定义中,但是如果您喜欢动态填充,我建议您在创建此表单以便向用户显示的位置对其进行修改。就像在视图中执行一些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',...}

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

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

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_field函数。

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

我今晚碰到了这个问题,结果就这样结束了。我希望这能帮助未来的人。

往复式py

class RecipeForm(Form):
    category = SelectField('Category', choices=[], coerce=int)
    ...

视图.py

@mod.route('/recipes/create', methods=['POST'])
def validateRecipe():
    categories = [(c.id, c.name) for c in g.user.categories.order_by(Category.name).all()]
    form = RecipeForm(request.form)
    form.category.choices = categories
    ...

@mod.route('/recipes/create', methods=['GET'])
def createRecipe():
    categories = [(c.id, c.name) for c in g.user.categories.order_by(Category.name).all()]
    form = RecipeForm(request.form)
    form.category.choices = categories
    return render_template('recipes/createRecipe.html', form=form)

我发现这个post也很有用

相关问题 更多 >