Python-Flask验证SelectField

Python-Flask验证SelectField,python,validation,google-app-engine,flask,flask-wtforms,Python,Validation,Google App Engine,Flask,Flask Wtforms,我在python领域很新奇,我正在尝试将外部Api与googleapple引擎一起使用,我想用一个selectField验证一个表单,该字段中填充了Api的json响应 这是我的密码 class CommentForm(FlaskForm): name = StringField('Nome', [required()]) nazionalita = SelectField('Nazionalita',[required()]) eta = IntegerField('E

我在python领域很新奇,我正在尝试将外部Api与googleapple引擎一起使用,我想用一个selectField验证一个表单,该字段中填充了Api的json响应

这是我的密码

class CommentForm(FlaskForm):
    name = StringField('Nome', [required()])
    nazionalita = SelectField('Nazionalita',[required()])
    eta = IntegerField('Eta', [required()])
    Comment = TextAreaField('Commento', [required()])
    Data = DateTimeField('Data',[required()],format='%d/%m/%Y', )
    submit = SubmitField('Inserisci', [required()])

    def validate_nazionalita(form):
       if  not form.nazionalita.data == None:
          raise ValidationError('Nazionalita non selezionata')

@app.route('/insert', methods=['GET'])
def insert():
    form = CommentForm()
    url = 'https://ajayakv-rest-countries-v1.p.mashape.com/rest/v1/all'
    req = urllib2.Request(url)
    req.add_header('X-Mashape-Key', MASHAPE_KEY)
    req.add_header('Accept', 'application/json')
    urlresponse = urllib2.urlopen(req)
    content = urlresponse.read()

    responde = make_response(content)

    responde.headers['content-type']='application/json'
    data = json.loads(responde.data)
    nation = list(data)
    scelte =[]
    scelte =  ([( s['callingCodes'] , s['name'] )for s in nation])
    form.nazionalita.choices= scelte
    return  render_template('insert.html', form=form)


@app.route('/insert', methods=['POST'])
def submit():
    form = CommentForm(request.form)
    if not form.validation():
        return render_template('insert.html', form=form), 400
    return redirect('/')
这是html页面:

<form method="post" action="/insert">
      {{ form.csrf_token }}
      <div> {{form.name.label}}: {{form.name}}  </div>

        {% if form.name.errors %}
            <ul class=errors>
                {% for error in form.name.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}


      <div> {{form.nazionalita.label}}: {{form.nazionalita}} </div>

        {% if form.nazionalita.errors %}
            <ul class=errors>
                {% for error in form.nazionalita.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}

      <div> {{form.eta.label}}: {{form.eta}} </div>

        {% if form.eta.errors %}
            <ul class=errors>
                {% for error in form.eta.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}

      <div> {{form.Data.label}}: {{form.Data}} </div>

        {% if form.Data.errors %}
            <ul class=errors>
                {% for error in form.Data.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}

      <div> {{form.Comment.label}}: {{form.Comment}} </div>

        {% if form.Comment.errors %}
            <ul class=errors>
                {% for error in form.Comment.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}

      <div> {{form.submit}} </div>
    </form>
我不明白为什么我会这么做。

谢谢大家。

我终于能够重现您的错误:您正在视图函数中为GET方法创建选项。但您并没有将它们添加到POST方法的view函数中。通过稍微修改
submit()
函数来解决此问题:

@app.route('/insert', methods=['POST'])
def submit():
    form = CommentForm(request.form)
    scelte = [( s['callingCodes'] , s['name'] )for s in nation]
    form.nazionalita.choices= scelte

    if not form.validate():
        return render_template('insert.html', form=form), 400
    return redirect('/')
这样,您也可以在post函数中添加选项,并可以验证它们。更干净的方法是将GET和POST处理程序放在同一个函数中:


注意:在原始版本中,
form.validate()
函数试图通过迭代
form.nazionalita.choices
列表来确定您所做的选择是否有效。由于您没有在表单类中设置任何选项,因此它是
None
。尝试在
None
上迭代会引发您遇到的异常。

你好,Roberto,欢迎来到Stackoverflow。为了确保您能得到快速而有用的回复,请阅读指南,并尽量缩小代码范围,以描述您的问题,而不会产生太大的开销。谢谢您,李先生,我会接受您的建议。您可以打印您的
scelte
?@Tiny.D是的,我可以。“GET”方法有效,selectField向我显示了正确的值。好的,那么你能分享你的完整错误跟踪日志吗?谢谢你的时间@Mrleeh你是说,sholud i nation as global var?顺便说一下,我的表单似乎没有验证()。尝试修改您的代码以匹配此模式,您应该是优秀的。
@app.route('/insert', methods=['POST'])
def submit():
    form = CommentForm(request.form)
    scelte = [( s['callingCodes'] , s['name'] )for s in nation]
    form.nazionalita.choices= scelte

    if not form.validate():
        return render_template('insert.html', form=form), 400
    return redirect('/')