Flask wtform缓存动态选择字段?

时间:2016-02-15 12:22:24

标签: python flask wtforms flask-wtforms

我的表单有问题,所以基本上我从数据库查询中动态加载了SelectField,每次我对数据库进行操作时,似乎SelectField都没有更新,跟随数据库中的实时值。

所以这是我的代码view.py

@app.route('/add/sale-transaction', methods=['GET', 'POST'])
def add_sale_transaction():
    form = forms.ItemSaleForm()

    if form.validate_on_submit():

        # get unsold items to be added so I can mark it sold
        items = models.Item.query.join(models.PurchaseTransaction) \
            .filter((models.Item.sale_transaction_id == None) & (models.Item.item_type_id == form.item_stock.data)) \
            .order_by(models.PurchaseTransaction.transaction_date) \
            .order_by(models.Item.id) \
            .limit(form.quantity.data)

        # for each item add sale transaction field to mark it sold
        for it in items:
            it.sale_price = form.sale_price.data
            it.sale_transaction_id = # something here..
            db.session.add(it)
            db.session.flush()

        db.session.commit()
        flash('Successfuly added new Sale Transaction')
        return redirect(request.path)

    return render_template('add-sale-transaction.html', form=form)

然后在我的form.py

class ItemSaleForm(wtforms.Form):
    sale_price = IntegerField(label='Sale Price: ',
                              validators=[InputRequired()])

    # get unsold items and its quantity
    unsold_items = db.session.query(models.Item.item_type_id, models.ItemType.item_type, func.count(models.Item.id)) \
        .join(models.ItemType) \
        .filter(models.Item.sale_transaction_id == None) \
        .group_by(models.Item.item_type_id)

    # convert to dict to be used by SelectField
    qty_separator = ' - qty: '
    unsold_items_dict = {}
    for item in unsold_items:
        unsold_items_dict[item[0]] = '{}{}{}'.format(item[1], qty_separator, item[2])

    item_stock = SelectField(label='Item Type: ',
                             coerce=int,
                             choices=unsold_items_dict.items(),
                             validators=[InputRequired()])
    quantity = IntegerField(label='Item Quantity',
                            validators=[InputRequired()])

以下是解释,如果我在/add/sale-transactionitem_stock字段中访问SelectField并填写表单,则应该向我提供未售出商品的列表< / strong> - 没有sale_transaction_id且没有sale_price的项目 - 并显示自己的quantity

因此,在我提交表单后,很明显未售出的商品列表会发生一些变化,但显然SelectField choices=没有变化,它仍然具有与之前相同的价值。

如果我在提交表单后进行手动查询,我可以看到未售出商品中的更改,因此我怀疑db.session到期/刷新或form在请求'/ add / sale-transaction'或者wtform缓存某些东西时不会重新创建..

任何帮助?

1 个答案:

答案 0 :(得分:0)

我已经解决了我的问题,事实证明,对于choicesSelectField属性的wtforms表现得有点奇怪。我找到了一些像this这样的解决方案,如果我在choice__init__()

中声明view,它就解决了我的问题