2017-02-20 4 views
-1

シンプルな学生CRUDデータベースを作成する私は「学生を追加する」機能を得ることができません。現在のところ、 "TypeError: 'NoneType'オブジェクトは反復可能ではありません。Flaskは外部ファイルからSelectFieldの選択肢をインポートします

**編集:これは、 'SelectField'の 'choices'に外部ルックアップテーブルを使用することによって発生していることがわかりました。選択肢の「キー、値」データを外部モジュールに正しく分割することによってこれを解決する方法を説明する最良の答えは答えとしてマークされます。ご協力ありがとうございました。 **

マイフォーム...

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

マイルックアップファイル 'lookup.py' ...

GENDER = [( '男性'、 '男性')、(」女性」、 '女性')ここで

であるトレースバック...

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

フルスタックトレースをエラーmessasageを投稿してください。 – Selcuk

+0

私はトレースバックを追加しました、私は完全なスタックトレースを取得する方法がわかりませんが、私はそれに取り組んでいます。 – Inyoka

+0

これを[mcve]に減らしてください。 – davidism

答えて

0

'choices ='を使用してSelectFieldに値をインポートするとき、ジェネレータが生成する必要がある値。

私が持っているでしょう、私の形で例えば

...

from .lookup import * 

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

が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')] 

あなたはたくさん持っている場合、これは価値がありますルックアップの選択肢私はこの導入を見つけた発電機の詳細については

...

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

+0

ビッグディディディズムに感謝してくれたコメントが私に「選択肢」を見せてくれました。 – Inyoka

-1

ビューコードで、form = AddStudent()でフォームを作成します。それはあなたに空の学生書式を与えます。要求のデータを含むフォームのデータを入力するには、form = AddStudent(request.form)を使用します。これにより、ご希望のデータがformに入力されます。

+0

彼らはFlask-WTFを使用しているので、これは間違っています。 – davidism

+0

[リンク} http://flask.pocoo.org/docs/0.12/patterns/wtforms/ Flask-WTFドキュメントから: 'form = RegistrationForm(request.form)' –

+1

これらのドキュメントはFlaskではなくWTForms用です-WTF、実際には、代わりにFlask-WTFを使用しています。 Flask-WTFのドキュメントhttp://flask-wtf.readthedocs.io/en/stable/quickstart.html#validating-formsをご覧ください。 – davidism

関連する問題