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.

为此,我向该字段添加了一个widget=SQLFORM.widgets.string.widget属性。auth_user.course_name正确显示文本框而不是下拉列表,但不允许用户输入course_name. 如果输入了有效courses.id的,它可以正常工作(如果它不是有效的 ID,则显示预期的错误消息)。

但是,我不知道如何让它接受 acourse_name而不是 ID。我理论上可以使用自动完成插件(确实有效),但这样做的目的是让用户只在知道有效的情况下提交表单course_name(有点像密码)。

这可能吗?

4

1 回答 1

2

我通过使用自定义验证类(替换 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 )中获得了验证类的模板

于 2013-06-12T18:55:01.570 回答