在Flask SelectField中不是有效的选择

时间:2019-08-07 05:51:08

标签: python flask flask-wtforms

填写表格后,我得到: 1

在Qaru,reddit中,我看到了很多解决该问题的方法,但找不到解决方法

所以,这是我的文件:

webapp.py

from flask import Flask, render_template, send_file, make_response
from forms import AAForm
from create_plot import ploter
import os

app = Flask(__name__)

SECRET_KEY = os.urandom(32)
app.config['SECRET_KEY'] = SECRET_KEY

@app.route('/', methods=['GET', 'POST']) 
def index():
    form = AAForm()
    if form.validate_on_submit():
        bytes_obj = ploter(form.uniprot_ids.data, form.the_dye.data)
        return send_file(bytes_obj, 
                         attachment_filename='plot.png', 
                         mimetype='image/png')
    return render_template('index.html', form=form)

if __name__ == '__main__':
    app.run(debug=True)

forms.py

from flask_wtf import FlaskForm
from wtforms import StringField, SelectField, SubmitField
from wtforms.validators import DataRequired
from dyes_list import dyes

class AAForm(FlaskForm):
    uniprot_ids = StringField('Uniprot id', validators=[DataRequired()])
    the_dye = SelectField('Краситель', choices=dyes, validators=[DataRequired()])
    submit = SubmitField('Паехалиии!')

dyes_list.py

dyes = [
        (['K', 'R', 'H'], 'Кумасси бриллиантовый синий'),
        (['N', 'Q', 'C'], 'Окрашивание серебром'),
        (['K', 'R', 'H'], 'Амидо черный'),
        (['K', 'R', 'H'], 'Бромфеноловый синий'),
        (['K'], 'Пирогаллоловый красный'),
        (['K', 'R', 'H'], 'Sypro Ruby'),
        (['W'], 'Stain-free'),
        (['H', 'C', 'Q', 'N'], 'Zn-имидазольное негативное окрашивание'),
        ]

index.html

<h1>Введите данные</h1>
    <form action="" method="post">
        {{ form.hidden_tag() }}
        <p>
            {{ form.uniprot_ids.label }}<br>
            {{ form.uniprot_ids(size=32) }}<br>
            {% for error in form.uniprot_ids.errors %}
            <span style="color: red;">[{{ error }}]</span>
            {% endfor %}
        </p>   
        <p>
            {{ form.the_dye.label }}<br>
            {{ form.the_dye(size=1) }}<br>
            {% for error in form.the_dye.errors %}
            <span style="color: red;">[{{ error }}]</span>
            {% endfor %}
        </p>
        <p>{{ form.submit() }}</p>
        {% block content %}{% endblock %}
    </form>

P.s。:很奇怪,但是如果您将键和值倒置到“染料”中,那么一切都会很好(至少不会出现问题)。

1 个答案:

答案 0 :(得分:0)

这些值是从browser as strings发送回来的,该值不会针对字符串数组进行验证。

相反,将您的值作为CSV字符串,然后在表单验证后将其拆分为一个数组。

dyes = [
        ('K,R,H', 'Кумасси бриллиантовый синий'),
        ('N,Q,C', 'Окрашивание серебром'),
        ('K,R,H', 'Амидо черный'),
        ('K,R,H', 'Бромфеноловый синий'),
        ('K', 'Пирогаллоловый красный'),
        ('K,R,H', 'Sypro Ruby'),
        ('W', 'Stain-free'),
        ('H,C,Q,N', 'Zn-имидазольное негативное окрашивание'),
        ]

@app.route('/', methods=['GET', 'POST'])
def index():
    form = AAForm()
    if form.validate_on_submit():
        _dyes = form.the_dye.data.split(',')
        bytes_obj = ploter(form.uniprot_ids.data, _dyes)
        return send_file(bytes_obj,
                         attachment_filename='plot.png',
                         mimetype='image/png')
    return render_template('index.html', form=form)