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.year) ではなく、case_years の主キー ID が表示されることです。

助けてください..

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))

また、コード行の末尾にセミコロンは必要ないことに注意してください。

更新 (提供された新しいコードに基づく):

ビューでは、SQLFORM または SQLTABLE を使用せず、単に単一の値を表示しているため、フィールドのrepresent属性は効果がありません。

{{=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 に答える