【问题标题】:Flask wtform cached dynamic select field?Flask wtform缓存的动态选择字段?
【发布时间】:2016-02-15 12:22:24
【问题描述】:

我的表单有问题,所以基本上我有一个从数据库查询动态加载的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-transaction 并填写表格,在字段item_stock (SelectField) 它应该给我未售出物品的列表 - 物品没有sale_transaction_id 也没有sale_price - 并显示自己的quantity

所以在我提交表单后,未售出的物品列表显然发生了一些变化,但SelectField choices=显然没有改变,它仍然具有与以前相同的值。

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

有什么帮助吗?

【问题讨论】:

    标签: python flask wtforms flask-wtforms


    【解决方案1】:

    我已经解决了我的问题,结果是 wtforms 在 SelectFieldchoices 属性中表现得有些奇怪。我找到了一些像this 这样的解决方案,如果我在__init__()view 中声明choice,它可以解决我的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多