Python web2py表单-按字符串字段而不是ID查找值
我在web2py中有这样一个模型:Python web2py表单-按字符串字段而不是ID查找值,python,web2py,web2py-modules,Python,Web2py,Web2py Modules,我在web2py中有这样一个模型: db.define_table('courses', Field('course_name','string')) db.define_table('auth_user', .... .... Field('course_name',db.courses,label=T('Course Name'), required=True, requires=IS_IN_DB(db,db.courses
db.define_table('courses',
Field('course_name','string'))
db.define_table('auth_user',
....
....
Field('course_name',db.courses,label=T('Course Name'),
required=True,
requires=IS_IN_DB(db,db.courses.id,'%(course_name)s'),
如果我基于auth_user表显示表单,auth_user.course_name
字段由包含courses
表中所有课程的下拉菜单表示。正如预期的那样,它使用课程.courses\u name
字段的内容显示它们,而不是课程.ID
字段(因为IS\u in\u DB要求中的字符串格式表示)
但是,我试图修改它,使其不使用下拉选择菜单,而只显示一个文本字段。我希望用户能够输入课程名称,并且只要该名称有效,表单就会正常工作
为此,我在auth\u user.course\u name
字段中添加了一个widget=SQLFORM.widgets.string.widget
属性。该属性正确地显示了一个文本框而不是下拉框,但不允许用户输入course\u name
。如果输入了有效的courses.id
,则效果良好(如果不是有效ID,则显示预期的错误消息)
然而,我不知道如何让它接受一个课程名称
,而不是ID。理论上我可以使用自动完成插件(它确实有效),但其目的是允许用户只在知道有效的课程名称
(有点像密码)的情况下提交表单
这可能吗?我通过使用自定义验证类(替换Is\u IN\u DB验证程序)解决了这个问题。作为参考,我的验证程序是这样的:
class COURSE_NAME_VALIDATOR:
def __init__(self, error_message='Unknown course name. Please see your instructor.'):
self.e = error_message
def __call__(self, value):
if db(db.courses.course_name == value).select():
return (db(db.courses.course_name == value).select()[0].id, None)
return (value, self.e)
我从web2py手册()中获得了验证类的模板