Отображается идентификатор внешнего ключа Web2py
Я впервые использую 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 вместо того, чтобы видеть значение (то есть case_years.year) в годах.
Пожалуйста помоги..
1 ответ
Если вы удалите явное requires
аргумент, тогда вы получите по умолчанию requires
то же самое, что вы определили, плюс вы получите значение по умолчанию represent
атрибут, который будет отображать год вместо идентификатора в SQLTABLE, SQLFORM.grid, а также считывать и обновлять 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).