2017-02-20 3 views
-1

Erstellen einer einfachen Student CRUD-Datenbank Ich kann nicht die Funktion "Hinzufügen eines Schülers" zu arbeiten. Derzeit produziert es - "TypeError: 'NoneType' -Objekt ist nicht iterierbar".Flask Import SelectField Auswahl von externen Datei

** BEARBEITEN: Ich habe herausgefunden, dass dies durch die Verwendung einer externen Nachschlagetabelle für 'SelectField' 'Optionen' verursacht wird. Die beste Antwort, die erklärt, wie man dies löst, indem man die Schlüssel- und Wertdaten der Auswahl korrekt in ein externes Modul aufteilt, wird als die Antwort markiert. Danke für Ihre Hilfe. **

Meine Form ...

class AddStudent(FlaskForm): 
    gender = SelectField('Gender :', choices=lookup.GENDER) 

Meine Suchdatei 'lookup.py' ...

gender = [('männlich', 'männlich'), (‘ Weiblich‘, 'weiblich')]

Hier ist der Traceback ...

builtins.TypeError 
TypeError: 'NoneType' object is not iterable 
File "/Users/inyoka/Documents/dev/study/app/stud/views.py", line 16, in add 
if form.validate_on_submit(): 
File "/Users/inyoka/Documents/dev/study/env/lib/python3.5/site-packages/flask_wtf/form.py", line 101, in validate_on_submit 
return self.is_submitted() and self.validate() 
File "/Users/inyoka/Documents/dev/study/env/lib/python3.5/site-packages/wtforms/form.py", line 310, in validate 
return super(Form, self).validate(extra) 
File "/Users/inyoka/Documents/dev/study/env/lib/python3.5/site-packages/wtforms/form.py", line 152, in validate 
if not field.validate(self, extra): 
File "/Users/inyoka/Documents/dev/study/env/lib/python3.5/site-packages/wtforms/fields/core.py", line 193, in validate 
self.pre_validate(form) 
File "/Users/inyoka/Documents/dev/study/env/lib/python3.5/site-packages/wtforms/fields/core.py", line 468, in pre_validate 
for v, _ in self.choices: 
TypeError: 'NoneType' object is not iterable 
+0

Bitte senden Sie den Fehler messasage mit voller Stack-Trace. – Selcuk

+0

Ich habe den Traceback hinzugefügt, ich weiß nicht, wie man einen vollständigen Stack-Trace bekommt, aber ich arbeite daran. – Inyoka

+0

Bitte reduziere dies auf [mcve]. – davidism

Antwort

0

Beim Importieren von Werten in das SelectField mit 'Auswahl =' müssen die Werte von einem Generator erzeugt werden.

Zum Beispiel in meiner Form hätte ich ...

from .lookup import * 

goal = SelectField('Professional Goal :', choices=Lookup(GOALS)) 

Würde die folgenden in lookup.py ...

class Lookup: 
    def __init__(self, items): 
     self.items = items 
    def __iter__(self): 
     for item in self.items: 
      yield(item) 

# List of choices to yield 
GOALS = [('none', 'None'), 
      ('TOEFL', 'TOEFL'), 
      ('IELTS','IELTS'), 
      ('iGCSE','iGCSE')] 

Dies ist sinnvoll, wenn Sie eine Menge finden müssen Auswahlmöglichkeiten zum Nachschlagen.

Weitere Informationen über Generatoren ich diese Einleitung gefunden ...

http://www.python-course.eu/generators.php

+0

Großes Dankeschön an @davidism, die Kommentare haben mich dazu gebracht, die "Wahlmöglichkeiten" zu betrachten. – Inyoka

-1

In Ihrem Ansichtscode erstellen Sie das Formular mit form = AddStudent(). Das gibt Ihnen ein leeres Studentenformular. Um die Daten im Formular mit den Daten aus der Anfrage zu füllen, verwenden Sie form = AddStudent(request.form). Dadurch werden form mit den Daten aus Ihrer Anfrage ausgefüllt.

+0

Sie verwenden Flask-WTF, das ist also falsch. – davidism

+0

Aus der [link] http://flask.pooco.org/docs/0.12/patterns/wtforms/ 'Flask-WTF-Dokumentation':' form = Registrierungsformular (request.form) ' –

+1

Diese Dokumente sind für WTForms, nicht Flask -WTF, in der Tat erwähnen sie Flask-WTF stattdessen an der Spitze. Schauen Sie sich die Flask-WTF-Dokumente an: http://flask-wtf.readthedocs.io/en/stable/quickstart.html#validating-forms. – davidism