validator - wtform python
Tengo problemas con los campos de selección wtforms cuando uso un POST con Flask (2)
Soy bastante nuevo en wtforms y frasco y estaba jugando con selectfields y obtuve un error. El formulario en sí funciona bien sin el campo de selección, pero con él recibo el siguiente error:
Error:
....fields.py", line 386, in pre_validate
for v, _ in self.choices: TypeError: ''NoneType'' object is not iterable
Veo el campo de selección por lo que se está representando. Sospecho que de alguna manera la identificación no se está validando correctamente en POST y no está devolviendo ninguna. ¿O tiene algo que ver con la devolución de mi tupla de campo selecto? También el campo ID que estoy usando se extrae de la clave ndb automática () .id () de GAE, que es bastante larga y desagradable. ¿Podría ser que la longitud de identificación utilizada para el campo de selección es demasiado larga?
Google no ha proporcionado mucho en términos del problema exacto, así que pensé que publicaría aquí. Código relevante a continuación. Si me falta algo por favor hágamelo saber
código de views.py:
@app.route(''/new/post'', methods = [''GET'', ''POST''])
@login_required
def new_post():
form = PostForm()
if form.validate_on_submit():
post = Post(title = form.title.data,
content = form.content.data,
hometest = form.hometest.data,
author = users.get_current_user())
post.put()
flash(''Post saved on database.'')
return redirect(url_for(''list_posts''))
form.hometest.choices = [ (h.key.id(),h.homename)for h in Home.query()]
return render_template(''new_post.html'', form=form)
myforms.py :
class PostForm(Form):
title = wtf.TextField(''Title'', validators=[validators.Required()])
content = wtf.TextAreaField(''Content'', validators=[validators.Required()])
hometest = wtf.SelectField(u''Home Name List'', coerce=int,validators=[validators.optional()])
new_post.html:
{% extends "base.html" %}
{% block content %}
<h1 id="">Write a post</h1>
<form action="{{ url_for(''new_post'') }}" method="post" accept-charset="utf-8">
{{ form.csrf_token }}
<p>
<label for="title">{{ form.title.label }}</label><br />
{{ form.title|safe }}<br />
{% if form.title.errors %}
<ul class="errors">
{% for error in form.title.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</p>
<p>
<label for="title">{{form.hometest.label}}</label><br/>
{{form.hometest}}
{% if form.hometest.errors %}
<ul class="errors">
{% for error in form.hometest.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</p>
<p>
<label for="title">{{ form.content.label }}</label><br />
{{ form.content|safe }}<br />
{% if form.content.errors %}
<ul class="errors">
{% for error in form.content.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</p>
<p><input type="submit" value="Save post"/></p>
</form>
{% endblock %}
Debes proporcionar choices=[...]
argumento, como
wtf.SelectField(u''Home Name List'',
choices=[(1, ''Label 1''),
(2, ''Label 2'')],
coerce=int,
validators=[validators.optional()])
form.validate
configurar sus opciones antes de llamar a validate_on_submit
as form.validate
intentará validar el valor provisto (si existe) contra la lista de opciones (que es None
antes de que configure las choices
):
form = PostForm()
form.hometest.choices = [(h.key.id(), h.homename) for h in Home.query()]
if form.validate_on_submit():
# form is valid, continue