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 %}
表单为空。我做错了什么?
这是获取下拉表单的基本方法。您可以使用 value
和 label
.
将数据处理成元组列表
class DropDown(Form):
fields = [(value, label), (value, label), (value, label)...]
dropdown = SelectField('Mydropdown', choices = fields)
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
我想为 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 %}
表单为空。我做错了什么?
这是获取下拉表单的基本方法。您可以使用 value
和 label
.
class DropDown(Form):
fields = [(value, label), (value, label), (value, label)...]
dropdown = SelectField('Mydropdown', choices = fields)
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