2017-10-18 16 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 예외가 발생합니다.

  1. coerce을 제거

    는 적어도 두 가지 해결책이 있습니다. 강제를 전달합니다

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

    이 값을, 그러나 당신은 "고객"을 설정 해제 (이 값을 처리해야합니다 :

  2. 사용하십시오 sentinel value 같은 0 또는 -1 어떠한 고객이 선택되지되고 있음을 나타내는 필드) 게시물 양식 처리.

+0

정확합니다! 고맙습니다. 나는 그것을 스스로 알아낼 수 있었어야했다. 변경을 처리하기 위해 경로 처리를 조정해야했습니다. 모든 설정. – xGlorify