#datatables #web2py
#таблицы данных #web2py
Вопрос:
У меня есть две таблицы, и я работаю с таблицами данных, и я хотел бы использовать дочернюю строку для отображения дополнительной информации о конкретной строке. Например, в таблице я буду отображать имя, фамилию, имя пользователя и адрес электронной почты, а в дочерней или расширяемой строке я буду показывать национальность этого пользователя. Проблема, с которой я сталкиваюсь, заключается в том, что когда я разворачиваю строку, в ней отображается только идентификатор из таблицы «User», а не описание, связанное с этим идентификатором. я впервые имею дело с таблицами данных, поэтому у меня нет опыта работы с этим.
Есть предложения по решению этой проблемы?
db.define_table('User',
Field('first_name', 'string'),
Field('last_name', 'string'),
Field('email','string'),
Field('username','string'),
Field('nationality','reference Nationality', requires = IS_IN_DB(db,db.Nationality.id,'%(description)s')
)
db.define_table('Nationality',
Field('description','string'),
format = '%(descripcion)s'
)
Мой контроллер
def user():
import json
usuario = json.dumps(db(db.auth_user.id>0).select().as_list())
return dict(formListar=XML(usuario))
//просмотр//
<script>
var tabla;
$(document).ready(function(){
tabla= $('#tablaGenerica').DataTable({
"data": {{=formListar}},
"scrollX": false,
"dom": 'lrtip',
"searching": true,
"sRowSelect": "single",
"columns": [
{
"class":"details-control",
"orderable":false,
"data":null,
"defaultContent": ""
},
{ data: 'first_name' },
{ data: 'last_name' },
{ data: 'email' },
{ data: 'username' },
]
});
$('#tablaGenerica tbody').on('click', 'td.details-control', function () {
var tr = $(this).closest('tr');
var row = tabla.row( tr );
if ( row.child.isShown() ) {
// This row is already open - close it
row.child.hide();
tr.removeClass('shown');
}
else {
// Open this row
row.child( format(row.data()) ).show();
tr.addClass('shown');
}
} );
function format ( d ) {
// `d` is the original data object for the row
return '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">'
'<tr>'
'<td>Nationality:</td>'
'<td>' d.nationality '</td>'
'</tr>'
'</table>';
}
</script>
<table id="tablaGenerica" class="tablaC table-striped hover cell-border" cellspacing="0" width="100%" >
<thead>
<tr>
<th></th>
<th>First name</th>
<th>Last name</th>
<th>Email</th>
<th>Username</th>
</tr>
</thead>
</table>
Ответ №1:
nationality
Поле в User
таблице является reference
полем, что означает, что оно хранит связанный идентификатор записи из Nationality
таблицы, а не description
. Чтобы включить description
поле из Nationality
таблицы в ваш JSON, вам нужно будет выполнить объединение при извлечении данных:
def user():
usuario = db(db.User.nationality == db.Nationality.id).select().as_json()
return dict(formListar=XML(usuario))
Обратите Rows
внимание, что объект имеет встроенный as_json
метод (немного более удобный, поскольку он автоматически обрабатывает специальные типы полей, такие как даты и время).
При объединении двух таблиц каждая запись в массиве JSON будет включать отдельный объект для каждой таблицы. Итак, JSON будет выглядеть следующим образом:
[
{
"User": { "first_name": ..., "last_name": ..., ... },
"Nationality": { "Description": ... }
},
...
]
Это означает, что спецификация столбцов для таблиц данных должна будет измениться на:
{ data: 'User.first_name' },
{ data: 'User.last_name' },
{ data: 'User.email' },
{ data: 'User.username' },
Обратите внимание, User.
префикс для каждого поля, указывающий на вложенность в User
объект записи.
Аналогично, в format
функции доступ к описанию национальности осуществляется через d.Nationality.description
, а не d.nationality
.