SelectField:为什么返回“无效选择错误”?

2024-09-30 01:31:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python很在行,所以这可能是个愚蠢的问题,抱歉

contact.html

{% extends 'layout.html' %}

{% block content %}

    <form method="POST" action="/">
    
       <fieldset class="form-field">
        {{ form.iro.label }}<br>
        {{ form.iro }}
        {% if form.iro.errors %}
          <ul class="errors">
            {% for error in form.iro.errors %}
            <li>{{ error }}</li>
            {% endfor %}
          </ul>
        {% endif %}
      </fieldset><br>
      
      {{ form.sub_issue }}

      </form>
  </div>

{% endblock %}

forms.py

from flask_wtf import FlaskForm
from wtforms import StringField, TextField, SubmitField, FieldList, FormField, SelectField, Form
from wtforms.validators import DataRequired, Length, Optional


class ContactForm(FlaskForm):
    """Contact form."""
    iro = SelectField(
        'IRO',
        choices=[]
    )
    
    sub_issue = SubmitField('Open an issue')

在我的代码中,我使用来自请求的json填充SelectField的choices参数

@app.route('/', methods=('GET', 'POST'))
def contact():
    form = ContactForm()
    if request.method == 'GET':
      r = requests.get("https://...",verify=False)
      form.iro.choices= [(iro,iro) for iro in list(r.json().values())]
      return render_template('contact.html', form=form)
    else:
      if form.validate_on_submit():
      #code when submitted...

但当我点击提交按钮时,在我的选择字段下会出现一个“无效选择”错误

你知道为什么吗


Tags: fromimportformifhtmlcontactissuepost
1条回答
网友
1楼 · 发布于 2024-09-30 01:31:08

我无法测试它,但对我来说,所有的问题都是您只在GET中向choices添加值。当您为POST运行validate_on_submit():choices为空,它将始终给出“无效选择”

你需要这样的东西

@app.route('/', methods=('GET', 'POST'))
def contact():
    form = ContactForm()

    r = requests.get("https://...", verify=False)
    form.iro.choices = [(iro,iro) for iro in list(r.json().values())]

    if request.method == 'GET':
      return render_template('contact.html', form=form)
    else:
      if form.validate_on_submit():
      #code when submitted...

如果requests总是获得相同的值,那么您应该在开始时只读取它们一次(在contact()之外),在本地文件或数据库中写入,然后在contact()中读取它们

如果requests可能给出不同的值,那么您应该在GET中读取它们,用uniqe名称保存在文件中(或用uniqe ID保存在数据库中),并将此名称/ID作为隐藏字段发送到HTML。稍后在POST中,您应该使用这个唯一的名称/ID从文件/数据库中读取

或多或少

@app.route('/', methods=('GET', 'POST'))
def contact():
    form = ContactForm()

    if request.method == 'GET':

      r = requests.get("https://...", verify=False)
      form.iro.choices = [(iro,iro) for iro in list(r.json().values())]

      save r.json() in unique file

      form.hidden_field = unique_file

      return render_template('contact.html', form=form)
    else:

      unique_file = form.hidden_field

      read r.json() from unique file

      form.iro.choices = [(iro,iro) for iro in list(r.json().values())]

      if form.validate_on_submit():
      #code when submitted...

相关问题 更多 >

    热门问题