Flask 从外部文件导入 SelectField 选择

Flask importing SelectField choices from external file

创建一个简单的学生 CRUD 数据库我无法使用 'Adding a Student' 的功能。目前它生产 - "TypeError: 'NoneType' object is not iterable"。

**编辑:我发现这是由于对 'SelectField' 'choices' 使用外部查找 table 引起的。解释如何通过将选择 'key, value' 数据正确分解到外部模块中来解决此问题的最佳答案将被标记为答案。谢谢您的帮助。 **

我的表格...

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

我的查找文件'lookup.py' ...

性别 = [('Male', 'Male'), ('Female', 'Female')]

这是回溯...

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

在您的视图代码中,您使用 form = AddStudent() 创建表单。这给你一个空的学生表格。要使用来自请求的数据填充表单中的数据,请使用 form = AddStudent(request.form)。这将使用您请求的数据填充 form

使用 '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