【发布时间】:2021-02-10 17:42:38
【问题描述】:
我是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 的选择参数
@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...
但是当我点击提交按钮时,我的 SelectField 下会出现“Not a valid choice”错误
你知道为什么吗?
【问题讨论】:
-
总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是截图,不是链接到外部门户)有问题(不是评论)。还有其他有用的信息。
-
也许首先使用
print()来查看contact()中变量的值,也许你会看到它是否在SelectField中得到正确的值。如果它得到错误的值,那么也许它可以帮助你修复它。 -
在
GET中,您将值添加到choices,但是当您运行else:并检查validate_on_submit():时,您在choices中没有这些值 - 所以它无法检查是否您选择了正确的值,它会发送"Not a valid choice"。在这两种情况下,您都必须将它们添加到choices- 在GET和POST中。也许在从 http://...` 获取之后,将它们保存在全局变量中,然后在检查else之前再次将它们添加到choicesvalidate_on_submit():
标签: python json flask flask-wtforms