Web2py显示外键ID

时间:2012-12-01 15:44:46

标签: python-2.7 web2py web2py-modules

我第一次使用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>

我面临的问题是,在显示来自&#34; my_years&#34;我在几年内看到了case_years的主键ID,而不是看到了Value(即case_years.year)。

请帮助..

1 个答案:

答案 0 :(得分:2)

如果删除显式requires参数,那么您将获得与您定义的默认requires相同的默认值represent,此外,您将获得将显示的默认Field('case_year', db.case_years, required=True) 属性年份而不是SQLTABLE,SQLFORM.grid中的id,以及读取和更新SQLFORM的。

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

另请注意,您的代码行末尾不需要分号。

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

在您的视图中,字段的{{=case.case_year}} 属性将不起作用,因为您没有使用SQLFORM或SQLTABLE,只是显示单个值:

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

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

{{=case.case_year.year}}

您也可以进行递归选择:

{{1}}

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