2013-06-12 61 views
0

查找值我在的web2py這樣一個模型:的web2py FORM - 由字符串字段,而不是ID

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要求中的字符串格式表示形式)。

但是,我試圖修改它,而不是使用下拉選擇菜單,它只是顯示一個文本字段,我期望用戶能夠輸入課程名稱,只要該名稱有效,該表單就可以正常工作

要做我添加了一個widget=SQLFORM.widgets.string.widget屬性到auth_user.course_name字段,它正確顯示了一個文本框而不是下拉菜單,但不允許用戶輸入course_name。如果有效的輸入(如果不是有效的ID,則顯示預期的錯誤消息)。

但是,我不知道如何使它接受course_name而不是ID。理論上我可以使用自動完成插件(它確實有效),但其目的是讓用戶只有在知道有效的course_name(它有點像密碼)時才提交表單。

這可能嗎?

回答

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

相關問題