【问题标题】:Flask importing SelectField choices from external file烧瓶从外部文件导入 SelectField 选项
【发布时间】:2017-07-09 18:39:20
【问题描述】:

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

**编辑:我发现这是由于使用外部查找表来获取“SelectField”“选择”。解释如何通过将选项“键、值”数据正确分解到外部模块来解决此问题的最佳答案将被标记为答案。谢谢您的帮助。 **

我的表单...

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

【问题讨论】:

  • 请发布带有完整堆栈跟踪的错误消息。
  • 我已经添加了回溯,我不知道如何获得完整的堆栈跟踪,但我正在努力。
  • 创建了一个名为 "addsmall" 的精简 Git 分支,以减少重现错误所需的代码。也使最初的介绍更加简洁。
  • 好像和validation有关,我这里实现了建议:stackoverflow.com/questions/10722968/…,表单提交了,但是没有验证。

标签: python sqlite flask flask-wtforms


【解决方案1】:

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

【讨论】:

  • @MennoHölscher 我已经完善了我的问题,基本上我的 SelectField 'choices' 选项的查找表不起作用。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多