我有两个表,我正在使用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>
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
访问国籍描述。