所以我用django服务器端处理实现了dataTables插件。看起来有点像这样:
模板:
<script type="text/javascript">
$(document).ready(function() {
$('#example').dataTable( {
"bProcessing": true,
"bServerSide": true,
"sAjaxSource": "/datatable/"
} );
} );
</script>
的观点:
def main_view(request):
return render_to_response('index.html')
def datatables_view(request):
start = request.GET['iDisplayStart']
length = request.GET['iDisplayLength']
query = myUser.objects.all()
total = query.count()
if request.GET.has_key('sSearch'):
# filtering...
query = query[start:start+length]
response = {"aaData": [(q.name, q.state, q.email) for q in query],
"iTotalRecords": total,
...additional params for dataTable... }
然后我使用json.dump序列化数据并像这样发送
s = json.dump(response)
return HttpResponse(s.read())
这可能有点不对,但那是因为我没有使用我的实际代码,而是将其从内存中写下来。如果这里有任何错误,那么这就是一般的想法并不重要...(另外,我使用json,因为我在django 1.5上运行它,其中不推荐使用simplejson)。
就像我说的,这很好用。页面的url与main_view一起使用,数据表将其ajax调用发送到datatables_view,并且所有内容都会打开。现在我想从服务器发送一些额外的数据(而不是到服务器)。在中,我想添加一些要在模板中使用的数据。此数据必须来自datatables_view,因为它依赖于当前查询并且应该是动态的。我把它添加到回复中:
response = {"aaData": [(q.name, q.state, q.email) for q in query],
"iTotalRecords": total,
...additional params for dataTable...,
"sMeow": query.filter(name='cat')[:20]}
这显然是一个例子,但重点是当你更改查询时(比如你用搜索词过滤或改变排序),那么sMeow 也会改变。然后我想以某种方式在模板上访问它。显然我不能这样做:
{{ sMeow }}
但是我也不能使用parseJSON,因为这不是文档收到的东西,它是 datatable 收到的东西,我需要使用API来访问它,尽管我可以'找到怎么做。
因为最终我有一个按钮在sMeow值上运行一些脚本(并将其发送到不同的请求)我看了一下tabletools插件,但它并不能很好地与服务器端一起使用(“ TableTools更侧重于客户端“source”。
我不羞于使用额外的插件,但我宁愿使用数据表的默认功能。任何帮助将不胜感激!
答案 0 :(得分:1)
我也使用django的数据表,包括服务器端处理。您想要实现的问题是数据表本身正在对URL发出非常具体的请求,并期望某些数据,以便它可以更新表。
您可以实现自定义fnServerData函数,提取sMeow
值并进行处理,然后委托fnCallback
获取数据表以更新表。但是,这只允许您使用javascript中的sMeow
值,因为处理发生在客户端(因此没有django模板)。
直接从上面的链接获取代码示例(并添加一点,请参阅注释):
$(document).ready(function() {
$('#example').dataTable( {
"bProcessing": true,
"bServerSide": true,
"sAjaxSource": "../examples_support/server_processing.php",
"fnServerData": function ( sSource, aoData, fnCallback ) {
$.getJSON( sSource, aoData, function (json) {
var obj = JSON.parse(json);
var smeow = obj['sMeow'];
// do what you need with smeow
fnCallback(json);
});
}
});
});