下拉列表中的 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)
验证器自动获取该小部件。
我有一个 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)
验证器自动获取该小部件。