У меня проблема с моей формой, поэтому в основном у меня есть SelectField
, динамически загружаемый из запроса базы данных, и каждый раз, когда я делал операцию с базой данных, кажется, что SelectField
не обновляется и не следует за значением в реальном времени в базе данных.Флажок wtform кэшированный динамический поле выбора?
так вот мой код 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
- и покажет i ts собственный quantity
.
Так после отправки формы, очевидно, некоторые изменения происходят в список непроданных пунктов, но, видимо, SelectField choices=
не меняется, она по-прежнему имеет такое же значение, как и раньше.
Если я вручную запрос после отправки формы, я могу видеть изменения в непроданных пунктов, поэтому я заподозрить либо db.session
экспирации/обновления или form
не воссоздан во время запроса к «/ добавить/продажи- транзакция "или, может быть, wtform-кеш-то ..
Любая помощь?