wtforms:下拉选择器,其值在模型 class 中定义

wtforms: dropdown selector with values defined in model class

我想为 flask-wtforms 创建一个模型,其中下拉选择器的值已经在模型中定义,因为它们总是相同的。我尝试了以下方法:

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)

观点:

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

当我使用

在 html 文件中渲染它时
{% 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 %}

表单为空。我做错了什么?

这是获取下拉表单的基本方法。您可以使用 valuelabel.

将数据处理成元组列表
class DropDown(Form):
    fields = [(value, label), (value, label), (value, label)...]
    dropdown = SelectField('Mydropdown', choices = fields)

Select Field Wtforms

Check out this for more detail

试试这个:

观点:

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)

模板:

{% 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>

_formhelpers.html 在这里 http://flask.pocoo.org/docs/0.11/patterns/wtforms/

加上

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