在另一个 table 中使用带有 selectable 签名的 SQLFROM.grid 插入多个数据

Insert multiple data using SQLFROM.grid with selectable signature in another table

祝所有 Whosebug web2py 大师在这里....

我找到了这个 link,现在已经 2 岁了。我有一个问题,我不知道如何编码。

我有 2 个实体(表),这是一个 M:M 关系

首先table:导师(顾问) 第二个table:学生名单

现在顾问处理了很多学生,学生有很多顾问对吗?

所以我创建了第三个 table 并将其命名为 Student_Adviser

学年

db.define_table('school_year',
            Field('sy',),
            Field('current_year', 'boolean'))

学生名单

db.define_table('student_list',
            Field('lastname'),
            Field('firstname'))

这些是 Student_Adviser

中的字段
db.define_table('stud_adviser',
            Field('sy_id', 'reference school_year', label='School Year'),
            Field('adv_id', 'reference auth_user', label='Adviser'),
            Field('stud_id', 'reference student_list', label='Student', unique=True)
           )

在控制器中

def getStudent():
    form = SQLFORM.grid(db.Student_List, csv=False, create=False, selectable=(need code here))
    return locals()

我问这种问题是因为它可以帮助顾问通过激活多个复选框来获取学生列表,所以在 he/she 选择学生后 he/she 将单击提交按钮和中提琴所有选中的数据会自动添加到Student_Advisertable中。我的想法在 web2py 中可行吗?

附加 1:

还请添加一个代码,该代码将自动插入已登录的 auth_user.id。

假设讲师 1 auth_user.id 是 1

讲师 1 已登录,因此所有事务 he/she 将执行 Student_Adviser 中 adv_id 的默认值 table 将始终为 1,依此类推。

另外 2 个:

当我尝试使用数据库接口在 Student_Adviser table 中手动添加数据时出现错误。

顺便说一句,我怎么会 post 出现回溯错误?代码示例在 Traceback 中不起作用。我不能 post 错误,因为它会破坏格式...但这是错误代码的最后一行(请基于 table in Student_Adviser)。

IntegrityError: foreign key constraint failed

应该这样做:

@auth.requires_login()
def getStudent():
    db.stud_adviser.sy_id.default = db.school_year(current_year=True).id
    db.stud_adviser.adv_id.default = auth.user_id
    def add_students(ids):
        for id in ids:
            db.stud_adviser.insert(stud_id=id)
    form = SQLFORM.grid(db.student_list, create=False, selectable=add_students,
                        csv=False)
    return dict(form=form)

selectable参数是一个回调函数,它接收在网格中选择的记录ID列表。作为该参数提供的 add_students 函数循环遍历 ID,并在 stud_adviser table 中为每个 ID 插入一条新记录。因为每条记录的学年和顾问 ID 应该相同,所以它们是通过设置各自字段的 default 属性来设置的(对于学年,我假设您需要当前学年的 ID)- - 通过从 .insert() 调用中排除这些字段,将自动插入默认值。

注意,要在网格中显示更多有用的详细信息(而不是学年、导师和学生记录 ID),您可以在每个 table 上定义 "format" 属性:

db.define_table('school_year',
     Field('sy'),
     Field('current_year', 'boolean'),
     format='%(sy)s')

db.define_table('student_list',
     Field('lastname'),
     Field('firstname'),
     format='%(lastname)s')

因为 db.auth_user table 是自动定义的(具有默认的 "format" 属性),您必须在事后更改其 "format" 属性——所以,在某处调用 auth.define_tables():

db.auth_user._format = '%(last_name)s'

使用上面定义的 "format" 属性,现在任何引用这些 table 的 reference 字段都将获得默认的 "represent" 属性基于引用 table 的 "format" 属性。这将控制参考字段值在网格(以及 SQLFORM 和 SQLTABLE 中)中的显示。