2013-04-10 3 views
13

benutze Ich bin ziemlich neu zu wtforms und Kolben und war mit Selectfields herumspielen und bekam einen Fehler. Die Form selbst funktioniert gut ohne SELECT aber mit ihm bekomme ich folgende Fehlermeldung:Ich habe Probleme mit wtforms selectfields, wenn ich einen POST mit Flask

Fehler:

....fields.py", line 386, in pre_validate 
    for v, _ in self.choices: TypeError: 'NoneType' object is not iterable 

ich die SELECT sehen, so dass es gemacht hat wird. Ich vermute, dass die ID auf POST nicht korrekt überprüft wird und keine zurückgibt. Oder hat es etwas damit zu tun, dass mein Selectfield-Tupel zurückgegeben wird? Auch das ID-Feld, das ich benutze, wird von GAEs automatischem ndb-Schlüssel(). Id() gezogen, der ziemlich lang und anstößig ist. Es könnte sein, dass die ID-Länge, die für das Auswahlfeld verwendet wird, zu lang ist.

Googling hat nicht viel in Bezug auf das genaue Problem zur Verfügung gestellt, so dachte, ich würde hier posten. Relevanter Code unten. Wenn ich etwas fehlt bin lass es mich wissen

views.py Code:

@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 %} 

Antwort

26

Sie benötigen eine Auswahl vor setzen Sie validate_on_submit als form.validate wird versuchen, rufen Sie den angegebenen Wert (falls vorhanden) gegen die Auswahlliste (die None ist zu validieren Es scheint, man kann tatsächlich nicht die Entscheidungen Argument in SELECT für dynamische Entscheidungen verwendet

form = PostForm() 
form.hometest.choices = [(h.key.id(), h.homename) for h in Home.query()] 

if form.validate_on_submit(): 
    # form is valid, continue 
+0

Wie können Sie es überspringen lassen spezifisches Feld, wenn Sie keine Validierung wünschen? Ich erhalte einen Fehler für das Datumsfeld mit validators = [validators.optional()] – moaglee

+0

Es lohnt sich, eine separate Frage dazu mit einem minimalen, reproduzierbaren Beispiel zu stellen. Jemand sollte helfen können :-) –

4

Sie sollten choices=[...] Argument liefern, wie

wtf.SelectField(u'Home Name List', 
       choices=[(1, 'Label 1'), 
         (2, 'Label 2')], 
       coerce=int, 
       validators=[validators.optional()]) 
+2

, wie in der Dokumentation dargestellt, wtforms.readthedocs.io/en/latest/..., denn: bevor Sie choices) eingestellt Auch wenn das Auswahlargument im Auswahlfeld eine Abfrage wie in 'wtf.SelectField (u'Home Name List ', Auswahlmöglichkeiten = [(h.key.id(), h.homename) für h in Home.query()] ist , coerce = int) 'diese Abfrage wird nicht jedes Mal ausgeführt, wenn das Formular angezeigt wird .. so dynamisch hinzugefügt Instanzen von zu Hause wird nicht in der Dropdownliste angezeigt .. von dem, was ich getestet habe –

Verwandte Themen