0

我第一次将 web2py 用于一个项目。我通过以下方式制作了一个字段

db.define_table('my_years',Field('case_year',db.case_years,required=True,requires = IS_IN_DB( db, 'case_years.id', '%(year)s' )));

该字段是指另一个具有年份列表的表,该表定义如下:

db.define_table('case_years',Field('year'),format = '%(year)s') ;

然后我在视图中显示 my_years。

<table id="case_list">
    <thead>
        <tr>
            <th>Number</th>
            <th>Year</th>
            <th>Action</th>
        </tr>
    </thead>
    <tbody>
            {{ for case in cases: }}
            <tr>
                <td>{{=case.case_number}}</td>
                <td>{{=case.case_year}}</td>
                <td><a href= "{{=URL(r=request, f='edit', args=case.id)}}"> Edit Case </a></td>
            </tr>
            {{pass}}
    </tbody>
</table>

我面临的问题是,在显示“my_years”中的年份时,我看到的是 case_years 的主键 ID,而不是年份中的值(即 case_years.year)。

请帮忙..

4

1 回答 1

2

如果您删除显式requires参数,那么您将获得一个requires与您定义它相同的默认值,另外您将获得一个默认represent属性,该属性将显示年份而不是 SQLTABLE、SQLFORM.grid 中的 id,并读取和更新 SQLFORM 的.

Field('case_year', db.case_years, required=True)

或者,您可以显式定义represent属性:

Field('case_year', db.case_years, required=True,
      requires=IS_IN_DB(db, 'case_years.id', '%(year)s'),
      represent=lambda id, r: db.case_years(id).year))

另外,请注意,您不需要在代码行末尾使用分号。

更新(基于提供的新代码):

在您看来,该字段的represent属性将不起作用,因为您没有使用 SQLFORM 或 SQLTABLE,而只是显示单个值:

{{=case.case_year}}

case.case_year 是一个 id 值,这就是上面显示的内容。如果要显示 db.case_years 表中的关联年份,则需要执行以下操作:

{{=db.case_years(case.case_year).year}}

您还可以进行递归选择:

{{=case.case_year.year}}

相当于上面的。请注意,这两种方法都会对每种情况产生额外的数据库查询,因此效率会有些低。相反,您可以对案例进行连接的初始查询,并包括 case_years 表中的“年份”字段(请参阅http://web2py.com/books/default/chapter/29/06#Inner-joins)。

于 2012-12-01T16:36:21.600 回答