wtform validator passwordfield fields python flask wtforms flask-wtforms

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