django datatables从服务器到模板的附加数据

时间:2013-08-28 11:08:20

标签: jquery django json datatable

所以我用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”。

我不羞于使用额外的插件,但我宁愿使用数据表的默认功能。任何帮助将不胜感激!

1 个答案:

答案 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);
            });
        }
    });
});