2013-07-13 3 views
15

Ich erstelle ein Produktbearbeitungsformular und benötige das Formular, das mit den vorherigen Daten ausgefüllt werden soll.Einen Standardwert im Auswahlfeld mit wtforms und flask festlegen

ich folgendes tue:

Product(form): 
    product = TextField('name') 
    category = SelectField('category', choice=[(1,'one'),(2,'two')]) 

Nach Ansicht:

form.product.data = 'A product name from the database' 
form.category.data = 'a category name' #This does not work 

Das Problem mit dem SELECT ist.

Ich verstehe, dass es einen 'Standard' Wert gibt, den ich auf SelectField einstellen kann. Dies geschieht jedoch in der Formulardefinitionsklasse und dort habe ich noch nicht das Abfrageobjekt von sqlalchemy.

Gibt es also eine Möglichkeit, einen Standardwert für Selectfield zur Laufzeit hinzuzufügen?

+1

'form.category.data = 1 'oder' form.category.data = 2' – falsetru

+1

ich versuchte. Funktioniert nicht. – kfk

+2

Es ist wie falsetru sagt, aber vor set coerce als int: 'Kategorie = SelectField ('Kategorie', Wahl = [(1, 'eins'), (2, 'zwei')], coerce = int)'. form ist die Produktformularinstanz. –

Antwort

16

Wenn Sie setzen Standardwert möchten Form machen Seite mit Ihnen eigene Form erstellen oder Einstellwert:

class Product(Form): 
    product = TextField('name') 
    category = SelectField('category', choices=[(1,'one'),(2,'two')]) 

# create instance with predefined value: 
form1 = Product(category=2) 
# form1.product == <input id="product" name="product" type="text" value=""> 
# form1.category == <select id="category" name="category"> 
#      <option value="1">one</option> 
#      <option selected value="2">two</option> 
#     </select> 
# from1.product.data == None 
# form1.category.data == 2 

# create own form if it need many times: 
Product2 = type('Product2', (Product,), { 
    'category': SelectField('category', default=2, choices=[(1,'one'),(2,'two')]) 
}) 
form2 = Product2() 
# form2.product == <input id="product" name="product" type="text" value=""> 
# form2.category == <select id="category" name="category"> 
#      <option value="1">one</option> 
#      <option selected value="2">two</option> 
#     </select> 
# from2.product.data == None 
# form2.category.data == 2 

Wenn Sie festlegen Standardformulardaten auf Anfrage wollen:

with app.test_request_context(method='POST'): 
    form = Product(request.form) 
    # form5.category.data == None 

    form = Product(request.form, category=2) 
    # form5.category.data == 2 

with app.test_request_context(method='POST', data={'category': 1}): 
    form = Product(request.form) 
    # form5.category.data == 1 

    form = Product(request.form, category=2) 
    # form5.category.data == 1 
8

Von der WTForms Dokumentation

Beachten Sie, dass die Auswahl Schlüsselwort nur einmal ausgewertet wird, so dass, wenn Sie eine dynamische Dropdown-Liste machen wollen, sollten Sie die Auswahlliste auf das Feld zuzuordnen, nachdem Instanziierung.

Product(form): 
    product = TextField('name') 
    category = SelectField('category') 

Und dann Ihrer Meinung nach sagen

form.category.choices = [list of choices with chosen data] 

Weitere Einzelheiten finden Sie hier: http://wtforms.simplecodes.com/docs/0.6.1/fields.html#wtforms.fields.SelectField