Идентификатор объекта Datatables

#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 .