将表格链接到下拉表格

时间:2014-10-20 20:09:20

标签: python web2py

我的代码目前为所有用户提供,并且由于某种原因在下拉列表中也有ID。

我在寻找:您选择一个用户并将其添加到作业中。在下拉列表中,它不应显示用户ID(当前显示为:John Doe(1))

那么你如何得到已经在链接表中的用户(或者只是那些没有的用户)并从用户可见的下拉列表中删除id

addUserForm = SQLFORM(db.assignments_users, showid=False, submit_button=T('Add User')).process()

1 个答案:

答案 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,如果两个用户具有相同的名称,则这两个名称都将出现在列表中,但是没有办法告诉另一个名称。