数据表对象ID

问题描述 投票:0回答:1

我有两个表,我正在使用Datatables,我想要做的是使用子行显示有关特定行的更多信息。例如,在表格中我将显示名字,姓氏,用户名和电子邮件,在子项或可扩展行上,我将显示该用户的国籍。我遇到的问题是,当我展开行时,它只显示“用户”表中的id,而不显示与该ID相关的描述。这是我第一次处理数据表,所以我没有经验。

有什么建议可以解决这个问题?

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> 
datatables web2py
1个回答
0
投票

nationality表中的User字段是reference字段,这意味着它存储来自Nationality表的关联记录ID,而不是description。要在您的JSON中包含description表中的Nationality字段,您需要在获取数据时进行连接:

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": ... }
  },
  ...
]

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.