私はPythonの世界では新規で、Googleのアップルエンジンで外部APIを使用しようとしていますが、selectFieldでApiのjsonレスポンスでフォームの検証を行いたいと思います。Python - Flask Validate SelectField
これは私のコード
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>
私はselectFieldを削除し、すべてうまく動作しますが、それに誤りがある場合:
`Traceback (most recent call last):
File "/home/roberto/Scrivania/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 267, in Handle
result = handler(dict(self._environ), self._StartResponse)
File "/home/roberto/Scrivania/simulazione/lib/flask/app.py", line 1994, in __call__
return self.wsgi_app(environ, start_response)
File "/home/roberto/Scrivania/simulazione/lib/flask/app.py", line 1985, in wsgi_app
response = self.handle_exception(e)
File "/home/roberto/Scrivania/simulazione/lib/flask/app.py", line 1540, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/roberto/Scrivania/simulazione/lib/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "/home/roberto/Scrivania/simulazione/lib/flask/app.py", line 1614, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/roberto/Scrivania/simulazione/lib/flask/app.py", line 1517, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/roberto/Scrivania/simulazione/lib/flask/app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "/home/roberto/Scrivania/simulazione/lib/flask/app.py", line 1598, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/roberto/Scrivania/simulazione/app/handlers/insert.py", line 46, in submit
if not form.validate():
File "/home/roberto/Scrivania/simulazione/lib/wtforms/form.py", line 310, in validate
return super(Form, self).validate(extra)
File "/home/roberto/Scrivania/simulazione/lib/wtforms/form.py", line 152, in validate
if not field.validate(self, extra):
File "/home/roberto/Scrivania/simulazione/lib/wtforms/fields/core.py", line 193, in validate
self.pre_validate(form)
File "/home/roberto/Scrivania/simulazione/lib/wtforms/fields/core.py", line 468, in pre_validate
for v, _ in self.choices:
TypeError: 'NoneType' object is not iterable`
と私はなぜこれを解決したeを理解していない。
ありがとうございます。
こんにちはRoberto、ようこそ、Stackoverflow。迅速で有益な回答を得るためには、[最小限で完全で検証可能なサンプルを作成する方法](https://stackoverflow.com/help/mcve)を参照し、コードを絞り込んで多くのオーバーヘッドはありません。 – MrLeeh
mrleehありがとう、私はあなたのアドバイスを受け取ります –
'scelte'を印刷できますか? –