来自下拉列表的Web2py多位数值被视为值列表

时间:2016-08-23 23:53:24

标签: forms list web2py

我有一个SQLFORM.factory字段:

Field('course', requires=IS_IN_SET(course_query, multiple=True), widget=SQLFORM.widgets.multiple.widget),

从查询中获取其内容:

course_query = external_db.executesql("SELECT course_id, course_title FROM course")

我希望用户能够选择一门或多门课程。提交后,他们提交的course_id将被捕获:

courses = request.vars.course

然后我遍历返回的course_id并将它们插入表中:

    if form.process().accepted:
    for course in courses:
        external_db.enrolment.insert(student_id=student, course_id=course)
    response.flash = 'Record saved'

当用户选择多个课程时,此功能正常。每个提交的记录都会使用正确的course_id插入到数据库中。但是,如果用户只选择一个具有2位数ID的课程,则只插入第一个数字。

我发现如果提交一个2位数的course_id值,Web2py会将其视为一个列表,每个数字都作为一个单独的元素。

如何将request.vars中的两位数值视为单个值而不是值列表?

谢谢大家。

1 个答案:

答案 0 :(得分:1)

从浏览器返回的整数值实际上是字符串,当您只选择一个值时,最终会得到一个字符串而不是字符串列表。在Python中,当您遍历字符串时,您将迭代字符串中的各个字符。在这种情况下,一个两位数的值只是一个两个字符的字符串,因此您的for循环将为每个数字运行一次。

一个简单的解决方案是使用form.vars.course代替request.vars.course。前者将是一个列表,即使只选择了一个值,因此您将迭代包含单个项目的列表,而不是迭代两个字符的字符串。

注意,在您调用form.vars之后,form.process()将不会使用已处理的表单值填充,因此您可能需要调整代码的顺序。

顺便说一句,没有必要指定widget参数,因为您将通过使用IS_IN_SET(..., multiple=True)验证器自动获取该窗口小部件。