【问题标题】:Web2py multi-digit value from dropdown gets treated as a list of values下拉列表中的 Web2py 多位值被视为值列表
【发布时间】:2016-08-23 23:53:24
【问题描述】:

我有一个 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 中的两位数值视为单个值而不是值列表?

谢谢大家。

【问题讨论】:

    标签: forms list web2py


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢@Anthony,你又说对了。我记得你让我注意 form.var 而不是 request.vars 从表单返回的值,我会记住这一点。
    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    相关资源
    最近更新 更多