我有一个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中的两位数值视为单个值而不是值列表?
谢谢大家。
答案 0 :(得分:1)
从浏览器返回的整数值实际上是字符串,当您只选择一个值时,最终会得到一个字符串而不是字符串列表。在Python中,当您遍历字符串时,您将迭代字符串中的各个字符。在这种情况下,一个两位数的值只是一个两个字符的字符串,因此您的for
循环将为每个数字运行一次。
一个简单的解决方案是使用form.vars.course
代替request.vars.course
。前者将是一个列表,即使只选择了一个值,因此您将迭代包含单个项目的列表,而不是迭代两个字符的字符串。
注意,在您调用form.vars
之后,form.process()
将不会使用已处理的表单值填充,因此您可能需要调整代码的顺序。
顺便说一句,没有必要指定widget
参数,因为您将通过使用IS_IN_SET(..., multiple=True)
验证器自动获取该窗口小部件。