我的代码目前为所有用户提供,并且由于某种原因在下拉列表中也有ID。
我在寻找:您选择一个用户并将其添加到作业中。在下拉列表中,它不应显示用户ID(当前显示为:John Doe(1))
那么你如何得到已经在链接表中的用户(或者只是那些没有的用户)并从用户可见的下拉列表中删除id
addUserForm = SQLFORM(db.assignments_users, showid=False, submit_button=T('Add User')).process()
答案 0 :(得分:2)
在db.assignments_users
表中,可能有一个链接到db.auth_users
表的引用字段。默认情况下,引用字段获得IS_IN_DB
验证程序,该验证程序接受链接表中的所有ID。验证器还用于生成表单的select
窗口小部件,窗口小部件中的值基于链接表的format
属性生成。 format
表的默认db.auth_user
属性为'%(first_name)s %(last_name)s (%(id)s)'
,这就是您在名称后面的括号中看到db.auth_user
记录ID的原因。
您可以通过为引用字段显式指定自己的验证器来覆盖上述默认行为。 IS_IN_DB
验证器的第一个参数可以是定义特定记录集的Set
对象(如果您不想列出引用表中的所有记录)。 IS_IN_DB
的第三个参数是label
参数,它允许您为每个记录指定自定义标签(Python字符串格式或函数/ lambda):
Field('user_id', 'reference auth.user',
requires=IS_IN_DB(db(query), 'auth_user.id', '%(first_name)s %(last_name)s'))
query
应该是一个查询,它会缩小您要包含在列表中的用户ID集。
注意,如果没有为引用字段指定requires
属性,除了自动获取默认IS_IN_DB
验证程序外,还会获得默认的represent
属性(基于在引用表的format
属性上)。但是,当您明确包含自己的requires
属性时,您将不再获得默认的represent
属性,因此您可能还需要指定该属性:
Field('user_id', 'reference auth_user',
requires=IS_IN_DB(db(query), 'auth_user.id', '%(first_name)s %(last_name)s'),
represent='%(first_name)s %(last_name)s')
最后,您可能需要重新考虑从标签中删除用户ID。如果没有ID,如果两个用户具有相同的名称,则这两个名称都将出现在列表中,但是没有办法告诉另一个名称。