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

Web2py multi-digit value from dropdown gets treated as a list of values

我有一个 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")

我希望用户能够 select 一门或多门课程,他们可以。提交后,他们提交的 course_id(s) 被捕获:

courses = request.vars.course

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

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

当用户 select 不止一门课程时,这很好用。每条提交的记录都会以正确的 course_id 插入到数据库中。但是,如果用户 select 只有一门课程,恰好有一个 2 位数的 ID,则只会插入第一个数字。

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

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

谢谢大家

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

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

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

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