2017-10-18 4 views
0

SOF hereで見つかった結果に続いて、既存の動作中のダイナミックフィールド(顧客)に空白のオプションを追加しようとしましたが、エラーが発生します。動的なWTFormフィールドに空白オプションを挿入しようとしています

エラーは、必要であれば、私は完全なトレースバックを提供することができますValueError: invalid literal for int() with base 10: ''.

です。ここで

フォームです - ダイナミックなフィールドは、あなたが見ることができるように、顧客のいずれかになります。

@app.route('/reports/filter_workorder', methods=['GET', 'POST']) 
@login_required 
def filter_workorder(): 
    results = None 
    form = FilterWorkorderForm() 
    form.customer.choices = [(cus.id, cus.company_name) for cus in Company.query.order_by('id')] 
    ### LINE CAUSING ERROR ### form.customer.choices.insert(0, ("", "")) ### LINE CAUSING ERROR ### 
    if request.method == 'POST': 
     if form.validate_on_submit(): 
      try: 
       customer_id = form.customer.data 
       customer = Company.query.filter_by(id = customer_id).first_or_404() 
       customer_name = customer.company_name 
       filter_data = {'id' : form.id.data, 'date' : form.date.data, 'customer_po' : form.customer_po.data, 'customer' : customer_name, 
       'work_description' : form.work_description.data, 'status' : form.status.data} 
       filter_data = {key: value for (key, value) in filter_data.items() if value} 
       results = Workorder.query.filter_by(**filter_data).all() 
      except Exception as e: 
       db.session.rollback() 
       flash(e) 
     return render_template('filter_workorder.html', form = form, results = results) 
    return render_template('filter_workorder.html', form = form) 

答えて

1

フォームをレンダリングしている問題、特に顧客:以下

class FilterWorkorderForm(FlaskForm): 
    id = IntegerField('id', validators=[Optional()]) 
    date = DateField('Date', validators=[Optional()]) 
    customer = SelectField('Customer', coerce=int, validators=[Optional()]) 
    customer_po = StringField('Customer PO', validators=[Optional()]) 
    requested_by = StringField('Requested By', validators=[Optional()]) 
    work_description = StringField('Work Description', validators=[Optional()]) 
    status = SelectField('Status', choices=[('Quote', 'Quote'), ('Pending', 'Pending'), ('WIP', 'WIP'), ('Complete', 'Complete'), ('TBI', 'TBI'), ('Invoiced', 'Invoiced'), ('VOID', 'VOID')]) 

がルートでありますフィールドには、整数強制があります。 WTForms's documentation on the Select widgetによると

フィールドは、ウィジェットがレンダリングに呼び出すiter_choices()方法を提供する必要があります。このメソッドは、(value, label, selected)のタプルを生成する必要があります。

あなたはthe source code for this methodを見れば:

def iter_choices(self): 
    for value, label in self.choices: 
     yield (value, label, self.coerce(value) == self.data) 

失敗した強制のために、この方法には例外処理はありません。あなたのケースでは、self.coerce(value)int('')として実行され、発生する例外はValueErrorになります。

、少なくとも2つの解決策があります

  1. coerceを削除します。
  2. 何の顧客が選択されていないことを表すために、このような0-1などsentinel valueを使用します。

    form.customer.choices.insert(0, (0, "")) 
    

    この値は強制を通過しますが、あなたは「顧客」の設定を解除する(この値を処理する必要がありますフィールド)投稿フォーム処理。

+0

これは間違いありません。ありがとうございました。私は自分自身でそれを理解することができたはずです。変更を処理するためにルート処理を調整するだけでした。準備完了。 – xGlorify

関連する問題