2016-06-30 28 views
0

Ich möchte ein Modell für flask-wtforms erstellen, in dem die Werte der Dropdown-Selektoren bereits im Modell definiert sind, da sie immer gleich sind. Ich habe versucht, die folgenden:wtforms: Dropdown-Selektor mit Werten definiert in Modellklasse

class DroppdownForm(Form): 
    fields = {} 
    df = pd.read_excel(open('formfile.xlsx', 'rb'), sheetname='Sheet1') 

    df.fillna(value='NA', inplace=True) 
    form_fields = ['COLUMN1', 'COLUMN2', 'COLUMN3'] 

    for form_field_name in form_fields: 
     fields[form_field_name] = SelectField(form_field_name, sorted(df[form_field_name].unique().tolist()), description=form_field_name) 

die Ansicht:

def show_entries(): 
    form=DroppdownForm() 
    return render_template('index.html', form=form) 

Als ich es dann mit

{% macro render_field(field) %} 
    <dt>{{ field.label }} 
    <dd>{{ field(**kwargs)|safe }} 
    {% if field.errors %} 
    <ul class=errors> 
    {% for error in field.errors %} 
     <li>{{ error }}</li> 
    {% endfor %} 
    </ul> 
    {% endif %} 
    </dd> 
{% endmacro %} 

{% for field in form %} 
    {{ render_field(field) }} 
{% endfor %} 

Die Form, in der HTML-Datei übertragen ist leer. Was mache ich falsch?

+0

Ist meine Antwort Hilfe? Wenn nicht, würde ich gerne weiter helfen. – formatkaka

+0

Ich denke, deine Antwort ist zu allgemein. In meinem Code können Sie sehen, dass ich ein selectfield in einer for-Schleife in der Modelldatei erzeuge, aber aus irgendeinem Grund funktioniert es nicht. Könnte es mit der Tatsache zusammenhängen, dass ich es in ein Wörterbuch einfüge? – Nickpick

Antwort

1

versuchen Sie dies:

die Ansicht:

from wtforms import Form, SelectField 
import pandas as pd 

def DroppdownFormGen(**kwargs): 

    class DroppdownForm(Form): 
     pass 

    df = pd.read_excel(open('MOCK_DATA.xlsx', 'rb'), sheetname='data') 
    df.fillna(value='NA', inplace=True) 
    form_fields = ['COLUMN1', 'COLUMN2', 'COLUMN3'] 

    for form_field_name in form_fields: 
     label = form_field_name 
     field = SelectField(label,choices=list(zip(range(5),sorted(df[form_field_name].unique().tolist())))) 
     setattr(DroppdownForm, label, field) 

    return DroppdownForm(**kwargs)  


@app.route('/form', methods=['GET'])  
def show_entries(): 
    form=DroppdownFormGen() 
    return render_template('form.html', form=form) 

die Vorlage:

{% from "_formhelpers.html" import render_field %} 

<form method=post action=""> 

{% for field in form %} 
    {{ render_field(field) }} 
{% endfor %} 

    <p><input type=submit value='Submit'> 
</form> 

wo _formhelpers.html hier ist http://flask.pocoo.org/docs/0.11/patterns/wtforms/

Plus

class MyClass(object): 
    class_var = 2 

    def __init__(self, i_var): 
     self.instance_var = i_var 

setattr(MyClass, 'a', 'value-of-a-field') 

foo = MyClass(5) 
bar = MyClass(6) 

print(foo.class_var, foo.instance_var, foo.a) 
# 2 5 value-of-a-field 
print(bar.class_var, bar.instance_var, bar.a) 
# 2 6 value-of-a-field 
print(MyClass.a) 
# value-of-a-field 
print(MyClass.class_var) 
# 2 
+0

Warum macht es einen Unterschied, wenn ich form = DropdownFormGen() oder form = DropdownForm() mache? – Nickpick

+0

Wenn ich setattr (DroppdownForm, label, field) setze DropdownForm ist bereits definiert, konnte ich nicht mit diesem Problem umgehen, ohne das Formular in eine Funktion zu wickeln. – sebnorth

+0

Es funktioniert, aber ich verstehe nicht, was Setattr genau macht. Werden mehrere Instanzen von DropdownForm erstellt? Wie werden sie dann zusammengehalten und von der Funktion zurückgegeben? – Nickpick

0

Dies ist die grundlegende Möglichkeit, ein Dropdown-Formular zu erhalten. Sie können Ihre Daten in eine Liste von Tupeln mit value und label verarbeiten.

class DropDown(Form): 
    fields = [(value, label), (value, label), (value, label)...] 
    dropdown = SelectField('Mydropdown', choices = fields) 

Select Field Wtforms

Check out this for more detail