2017-10-18 4 views
0

Ich versuche, eine leere Option in einem vorhandenen dynamischen Arbeitsfeld (Kunde) nach einem Ergebnis, das ich auf SOF here gefunden habe, jedoch einen Fehler zu erhalten.Versuchen, leere Option in dynamisches WTForm-Feld einzufügen

Der Fehler ist ValueError: invalid literal for int() with base 10: ''.

ich die volle Rückverfolgung bei Bedarf zur Verfügung stellen kann. Hier

ist die Form - das dynamische Feld ist der Kunde ein, wie Sie sehen können:

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')]) 

Im Folgenden finden Sie die Route:

@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) 

Antwort

1

Das Problem Formulare rendert, speziell der Kunde Feld, mit der Ganzzahlzwang.

Nach dem WTForms's documentation on the Select widget:

Das Feld muß ein iter_choices() Verfahren bereitzustellen, die das Widget auf Rendering nennen; Diese Methode muss Tupel von (value, label, selected) ergeben.

Wenn Sie the source code for this method aussehen:

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

Es gibt keine Ausnahmebehandlung bei dieser Methode für gescheiterte Zwang. In Ihrem Fall wird self.coerce(value) als int('') ausgeführt, was die Ausnahme ValueError verursacht, die Sie begegnen.

Es gibt mindestens zwei Lösungen:

  1. coerce entfernen.
  2. Verwenden Sie ein sentinel value wie 0 oder -1 vertreten, dass kein Kunde ausgewählt wird:

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

    Dieser Wert wird Zwang passieren, aber Sie werden diesen Wert behandeln müssen (unscharf zu schalten, den „Kunden“ Feld) Post-Formular-Verarbeitung.

+0

Das ist korrekt! Vielen Dank. Ich hätte das selbst herausfinden können. Ich musste nur meine Routenbearbeitung anpassen, um mit der Änderung fertig zu werden. Alles bereit. – xGlorify

Verwandte Themen