18

我正在尝试根据本文档http://wtforms.simplecodes.com/docs/1.0.2/specific_problems.html#dynamic-form-composition在具有动态字段的 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'

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

4

6 回答 6

10

我今晚遇到了这个问题并以这个结束。我希望这对未来的人有所帮助。

食谱表格.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)

我发现这篇文章也很有帮助

于 2013-05-06T05:04:36.877 回答
7
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 函数。

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

于 2013-08-19T23:06:22.420 回答
6

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

您需要填写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',...}

因此,如果您在定义表单时将某些内容分配给选择,它将从一开始就拥有该数据,并且您需要在哪里拥有用户类别,只需在视图中覆盖它即可。

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

于 2012-10-12T07:14:23.803 回答
1

您是否尝试过调用append_entry()表单实例而不是 FieldList 定义?

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

form = F()
form.fld.append_entry()
于 2014-09-11T20:03:16.630 回答
1

这就是我让它工作的方式。

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)]

奇怪的是,如果我使用coerce=int. 我自己是flask初学者,所以我不确定为什么coerce=int会导致问题。

于 2019-01-08T13:22:27.570 回答
-1

WTForms 文档类 wtforms.fields.SelectField

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

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')]
于 2017-03-17T07:21:11.183 回答