数据表对象 ID

Datatables Object ID

我有两个 table,我正在使用 Datatable,我想做的是使用子行来显示有关特定行的更多信息。例如,在 table 上,我将显示名字、姓氏、用户名和电子邮件,而在子行或可扩展行上,我将显示该用户的国籍。 我遇到的问题是,当我展开该行时,它仅显示 'User' table 中的 ID,而不显示与该 ID 关联的描述。 这是我第一次处理数据table,所以我没有这方面的经验。

有什么解决这个问题的建议吗?

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> 

Usertable中的nationality字段是一个reference字段,这意味着它存储了来自Nationalitytable,而不是 description。要在 JSON 中包含 Nationality table 中的 description 字段,您需要在获取数据时进行联接:

def user():
    usuario = db(db.User.nationality == db.Nationality.id).select().as_json()
    return dict(formListar=XML(usuario))

请注意 Rows 对象有一个内置的 as_json 方法(更方便一些,因为它会自动处理特殊字段类型,例如日期和时间)。

连接两个 table 时,JSON 数组中的每条记录将为每个 table 包含一个单独的对象。所以,JSON 看起来像:

[
  {
    "User": { "first_name": ..., "last_name": ..., ... },
    "Nationality": { "Description": ... }
  },
  ...
]

这意味着 Datatables 的列规范必须更改为:

{ data: 'User.first_name' },
{ data: 'User.last_name' },
{ data: 'User.email' },
{ data: 'User.username' },

请注意,每个字段的 User. 前缀表示嵌套在记录的 User 对象中。

同样,在format函数中,通过d.Nationality.description而不是d.nationality访问国籍描述。