首页 文章

web2py FORM - 按字符串字段而不是ID查找值

提问于
浏览
0

我在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 回答

  • 1

    我通过使用自定义验证类(替换IS_IN_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手册(http://www.web2py.com/book/default/chapter/07#Custom-validators)获得了验证类的模板

相关问题