【问题标题】:Not a valid choice in Flask SelectField不是 Flask SelectField 中的有效选择
【发布时间】:2019-08-07 05:51:08
【问题描述】:

填写表格后,我得到: 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>

附注:这很奇怪,但如果你在“染料”中反转位置键和值,一切都会正常工作(至少你不会遇到这个问题)。

【问题讨论】:

    标签: python flask flask-wtforms


    【解决方案1】:

    这些值从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)
    

    【讨论】:

      猜你喜欢
      • 2020-02-27
      • 2017-08-26
      • 2012-12-20
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 2021-05-15
      相关资源
      最近更新 更多