2016-02-15 2 views
1

У меня проблема с моей формой, поэтому в основном у меня есть 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-кеш-то ..

Любая помощь?

ответ

0

Я исправил свои проблемы, выяснилось, что это wtforms, который ведет себя немного странно с атрибутом choices для SelectField. Я нашел некоторые решения, такие как this, и он решает мою проблему, если я объявляю choice либо в __init__(), либо view

Смежные вопросы