【问题标题】:web2py FORM - lookup value by string field instead of IDweb2py FORM - 通过字符串字段而不是 ID 查找值
【发布时间】:2013-06-08 23:03:17
【问题描述】:

我在 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(有点像密码)时才提交表单。

这可能吗?

【问题讨论】:

    标签: python web2py web2py-modules


    【解决方案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) 中获得了验证类的模板

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-03
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 2016-08-23
      • 2021-03-09
      相关资源
      最近更新 更多