我在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.id,'%(course_name)s'),
如果我显示基于auth_user表的表单,则 auth_user.course_name
字段由包含 courses
表中所有课程的下拉菜单表示 . 正如所料,它使用 courses.course_name
字段的内容显示它们,而不是 courses.ID
字段(因为IS_IN_DB要求中的字符串格式表示 .
但是,我希望用户能够输入课程名称,只要该名称是有效的 course_name
,表单就能正常工作 .
为此,我在 auth_user.course_name
字段中添加了 widget=SQLFORM.widgets.string.widget
属性 . 这正确显示文本框而不是下拉列表,但不允许用户输入 course_name
. 如果输入有效的 courses.id
,它可以正常工作(如果它不是有效的ID,则显示预期的错误消息) .
但是,我无法弄清楚如何让它接受 course_name
而不是ID . 理论上我可以使用自动完成插件(确实可以工作),但这样做的目的是允许用户只有在知道有效的 course_name
(它有点像密码)时才提交表单 .
这可能吗?
1 回答
我通过使用自定义验证类(替换IS_IN_DB验证器)来解决这个问题 . 作为参考,这是我的验证器的样子:
我从web2py手册(http://www.web2py.com/book/default/chapter/07#Custom-validators)获得了验证类的模板