2016-07-14 19 views
1

in einer Film-Rating-App möchte ich eine WTF-Form in Kolben mit dynamischer Anzahl von Feldern generieren. wenn es drei Filme gibt, gibt es drei Felder.dynamische Form in Flask

dachte ich über ein paar Optionen, aber keiner von ihnen arbeitete:

class RatingForm(Form): 
    rating = TextField("rating",[validators.Length(min=1, max=1)]) 
    movie_order=TextField("movie",[validators.Length(min=1, max=1)]) 
    submit = SubmitField("submit rating") 
  1. einen Parameter in das Formular-Objekt übergeben - ich sehe nicht, wie kann ich einen Parameter dieser Art passieren von Klasse

  2. machen Sie eine Schleife innerhalb der Vorlage, so generieren und zurückgeben mehrere Formen, und wählen Sie die richtige. das funktioniert auch nicht, da die request.form unveränderlich istDict, und am Ende habe ich mehrere Felder mit demselben Schlüssel, auf den ich nicht zugreifen kann.

    {% for movie in movies_to_rate %} 
        <p> 
        <form method="POST" enctype="multipart/form-data" action="/rate"> 
        {{ movie}} 
        {{ forms[movie].rating}} 
        {{ forms[movie].submit }} 
        <input type="submit" value="Go"> 
    
    </p> {% endfor %} 
    

irgendwelche Ideen, was kann ich tun?

+0

Sie können über [diese] voll dynamische Kontrolle (http://wtforms.readthedocs.io/en/latest/specific_problems .html # dynamic-form-composition), aber ich weiß nicht, ob es eine bessere Lösung für Ihr Problem gibt. – syntonym

+0

@syntonym danke, aber ich war auf der Suche nach etwas mehr zu Flasche ... – Shgidi

+0

Eine wilde Vermutung, aber könnten Sie eine Liste von Formularinstanzen an die Vorlage übergeben? – iScrE4m

Antwort

0

Ich denke, Sie können eine Liste von TextFields als ein Klassenmitglied generieren, anstatt ein Feldobjekt zu verwenden. (Obwohl es ein bisschen komisch aussieht, nehme ich an Ihre Validatoren sind, was Sie gemeint.)

class RatingForm(Form): 
    def __init__(self, count): 
     self.ratings = [TextField("rating_" + str(i), [validators.Length(min=1, max=1)]) 
        for i in range(count)] 
     ...