2017-08-23 2 views
0

Wenn Sie dynamically add a field to a WTForms form eingeben, werden die neu hinzugefügten Felder nicht validiert (auch wenn Sie Validatoren hinzufügen).Das dynamische WTForm-Feld ist nicht validiert.

Zum Beispiel in Flask:

@app.route('/add', methods=['GET', 'POST']) 
def add(): 
    if 'state' not in session: 
     session['state'] = 1 

    form = MyForm() 

    if request.method == 'POST' and form.validate(): 
     if session['state'] == 1: 
      setattr(
       MyForm, 
       'asd', 
       StringField(
        'asdfield', 
        validators = [ 
         DataRequired(), 
         Length(min=1) 
        ] 
       ) 
      ) 
      form = MyForm() 
      session['state'] = 2 
      return render_template(
       'add.html', 
       form=form 
      ) 
     print(len(form.asd.data)) # can equal 0 
     session['state'] = 1 
     return redirect('/add') 
    return render_template(
     'add.html', 
     form=form 
    ) 

Ich glaube, dies auf die Tatsache zurückzuführen ist, dass form = MyForm() jedes Mal, wenn Sie zu /add gehen ausgeführt wird, so dass selbst wenn session['state'] == 2 Sie form.validate() auf einem Standardformular ausgeführt, das nicht habe das dynamisch hinzugefügte Feld. Daher kann dieses Feld nicht Teil des Formularvalidierungsprozesses sein.

Wie kann man dieses Verhalten richtig angehen? Wenn es nicht möglich ist, wie kann man Felder zu einem bestehenden Formular so dynamisch hinzufügen, dass alle Felder bei der Übergabe ordnungsgemäß validiert werden?

Antwort

0

Da Sie validate() aufrufen, bevor Sie das Feld hinzufügen, können Sie natürlich ein Feld nicht validieren, das noch nicht existiert. Das heißt, Sie möchten kein Feld zu einer Instanz anstelle einer Klasse hinzufügen. Der Grund hierfür ist, dass WTForms seine Eingabedaten bei der Konstruktion verarbeitet und das Hinzufügen von Feldern zur Instanz meist eine bedeutungslose Sache ist.

Wenn Ihre Feldnamen statisch ist, können Sie den del Trick detaillierte here

verwenden Wenn es dynamisch, können Sie stattdessen die dynamic form composition pattern aus der Dokumentation folgen.

Da ich über diese im Detail gegangen bin, werde ich mein vorheriges Beispiel hier verlinkt: Wtfforms dynamic generation

+0

ich, dass vorher tatsächlich getan habe und es hat funktioniert, aber ich habe vergessen, einen Teil des Codes in dem zeige Fehler wenn 'session ['state'] == 2' (was mich glauben macht, dass es keine Validierung gab). Ich sollte auch erwähnen, dass das dynamische Feld mit "Delattr" entfernt werden muss, sonst bleiben sie für immer. – Dreadlockyx