使用SQLFROM.grid插入多个数据,并在另一个表中添加可选签名

时间:2015-09-28 13:14:16

标签: web2py

所有stackoverflow web2py Guru的好日子......

我现在发现了link及其2岁。我遇到了问题而且我不知道如何编码。

我有2个实体(表格),它是M:M关系

第一张表:讲师(顾问) 第二张表:学生名单

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

所以我创建了第三个表,并将其命名为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()

我问这样的问题,因为它可以帮助顾问通过激活多个复选框来获取学生列表,因此在他/她选择学生之后他/她将点击提交按钮并且中提取所有已检查的数据将自动添加到Student_Adviser表。我的想法是否可以在web2py中使用?

附加1:

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

当讲师1 auth_user.id为1

时,让我们说

教师1已登录,因此他/她在Student_Adviser表中执行默认值adv_id的所有事务将始终为1,依此类推。

附加2:

当我尝试使用db接口手动添加Student_Adviser表中的数据时,我收到了错误。

btw如何发布Traceback错误? Code Sample在Traceback中不起作用。我无法发布错误,因为它会破坏格式...但这是错误代码的最后一行(请基于Student_Adviser中的表格)。

IntegrityError: foreign key constraint failed

1 个答案:

答案 0 :(得分:1)

这样的事情应该这样做:

@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表中为每个记录插入新记录。因为每个记录的学年和顾问ID应该相同,所以通过设置各自字段的default属性来设置它们(对于学年,我假设您想要当前学年的ID) - - 通过从.insert()调用中排除这些字段,将自动插入默认值。

注意,要在网格中显示更多有用的详细信息(而不是学年,顾问和学生记录ID),您可以在每个表上定义“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表是自动定义的(使用默认的“format”属性),所以必须在事后更改其“format”属性 - 所以,在调用auth.define_tables()后的某个地方:

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

使用上面定义的“format”属性,现在引用这些表的任何引用字段将根据引用表的“format”属性获得默认的“表示”属性。这将控制网格中(以及SQLFORM和SQLTABLE中)参考字段值的显示。