Flask从外部文件导入SelectField选项

时间:2017-02-20 13:02:55

标签: python sqlite flask flask-wtforms

创建一个简单的学生CRUD数据库我无法获得“添加学生”的功能。上班。目前它产生了 - " TypeError:' NoneType'对象不可迭代"。

**编辑:我发现这是因为使用外部查找表来实现' SelectField' '选择&#39 ;.最好的答案解释了如何通过正确地分解选择来解决这个问题'关键,价值'数据到外部模块将被标记为答案。谢谢您的帮助。 **

我的表格......

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

在您的视图代码中,您使用form = AddStudent(request.form)创建表单。这会给你一个空的学生表格。要使用form中的请求数据填充表单中的数据。这将使用您请求中的数据填充var htmlStr for(var i=0;i<data.length;i++){ htmlStr += "<input class='my_button' type='button' data-value='" + data[i].value + "' value='" + data[i].value + "'/>"; } $("#keyvals").html(htmlStr); $('.my_button').click(function(){ alert(this.data-value); });