数据表未显示最后一行

时间:2014-01-14 15:16:34

标签: jquery django datatables

我正在使用jQuery datatables插件来显示一个表,但无论我有多少行,最后一行都不会显示。使用"bInfo": true,它在底部显示“显示11个条目中的1到10个”,因此它清楚地知道还有另一行。我尝试启用分页,但是当下一个箭头全部亮起并且所有内容都点亮时,点击它就什么也没做。

我99%确定问题与最后一行中的项目没有关系,就像我添加一个名为“Z”的新项目成为缺失的项目(他们“按字母顺序排列”

这是我的数据表初始化:

dataTable({
            "bPaginate": false,
            "bProcessing": true,
            "bServerSide": true,
            "bDeferRender": true,
            "bSort": true,
            "aoColumnDefs": [
                             { 'bSortable': false, 'aTargets': ["_all"] },
                             { 'sDefaultContent': "N/A", 'aTargets': [0,1,4,5,6,7] },
                             { 'sDefaultContent': 0, 'aTargets': [2,3,8,9,10] }
                         ],
            "bInfo":true,
            "sAjaxSource": Django.url('dash:testsets_header', testSetId),
            "bFilter": false,

            "oLanguage": {
                "sProcessing": '<i class="icon-spinner icon-spin"></i> Loading...',
                "sZeroRecords": "No Test Set loaded."
            },

            "aoColumns": [
             //Various column definitions
            ]
        });

知道最后一行不会出现的原因吗?

2 个答案:

答案 0 :(得分:1)

由于你没有共享你自己的代码,并且你提到过使用eztables,我想我会快速写一下如何手动集成django和dataTables。这是一个更多的工作,但我认为灵活性确实得到了回报,让你准确定义你想要使用什么和不想用什么。

完全披露:我讨厌一般观点。作为对此的延伸,我也讨厌eztables和django的所有自动集成工具,这些工具阻止你实际学习如何自己做某事。这只是我的意见。话虽这么说,将django与dataTables集成并不是很复杂。只是dataTables发送了一个非常具体的XHR请求,你需要相应地解决它。以下是提供的代码here的粗略翻译。 Alsom从Django 1.5开始,simplejson已被弃用,我将向您展示如何使用json。

就我而言,我创建了一个名为Item的模型,它只有两个字段 - 名称和电子邮件。它只是我很久以前创建的虚拟模型,我发送垃圾邮件进行测试。然后我写了这个基本代码来处理数据表。请注意,客户端代码位于另一个视图上(而不是返回dataTables XHR请求的视图)。

这是代码,之后我会重点关注。

客户端:

<table id="example" class="table">
    <thead>
        <tr>
            <th>Name</th>
            <th>Email</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td colspan="2" class="dataTables_empty">Loading data from server</td>
        </tr>
    </tbody>
</table>

<script type="text/javascript">
$(document).ready( function () {
  $('#example').dataTable( {
    "bServerSide": true,
    "sAjaxSource": "/datatables_view/"
  } );
} );
</script>

服务器端:

import json
from cStringIO import StringIO

def datatables_view(request):
    items = Item.objects.all()

    # count total items:
    total = items.count()

    #filter
    search = request.GET['sSearch']
    qs = Q(name__contains=search) | Q(email__contains=search)
    itemes = items.filter(qs)


    # ... etc., all other filtering done here...


    # count items after filtering:
    total_filtered = items.count()


    # slice according to length sent by dataTables:
    start = int(request.GET['iDisplayStart'])
    length = int(request.GET['iDisplayLength'])
    items = items[start:(start+length)]

    response = {
        'aaData': [ [i.name, i.email] 
                        for i in items],
        'iTotalRecords': total,
        'iTotalDisplayRecords': total_filtered,
        'sEcho': request.GET['sEcho']
    }

    s = StringIO()
    json.dump(response, s)
    s.seek(0)
    return HttpResponse(s.read())

这可能看起来很可怕,但不应该。让我们分解它(我只会介绍基础知识,你会从这里开始):

  1. 正如我所提到的,dataTables发送了一个非常具体的XHR请求。所以我们所做的就是返回JSON中的预期响应。您可以看到正在发送的参数列表以及预期返回here的参数。你也可以花费它们来回发送你自己的东西,但是现在让我们忽略它。
  2. 首先,您需要在json中返回数据。我喜欢使用StringIO(或更确切地说cStringIO更快),因为当我最初使用json.dumps时,它会做各种各样的疯狂错误,我只是对它感到恼火。使用StringIO,我从来没有遇到过这样的问题,因此这是我的正常方法(尽管显然不是唯一的方式),甚至可能不是最好的方法。
  3. 始终返回sEcho,它只是dataTables的安全机制
  4. iTotalRecords和iTotalDisplayRecords非常不言自明,它们只返回总数和后过滤总数(注意它在切片之前)
  5. 使用iDisplayStart和iDisplayLength计算显示的值
  6. aaData是您要发送的实际数据的二维矩阵。每个列表应与空填充器td <td colspan="2" class="dataTables_empty">的colspan的长度相同。在这种情况下,只需要姓名和电子邮件,但你可以明显地花费它,但是你想要
  7. sSearch是dataTables顶部的实时搜索输入。您可以使用它来定义如何过滤(我只是为两个字段组合了__contains,但您可以花费这些并创建自己的逻辑,这很有用)
  8. 上面的示例不会显示列排序的任何痕迹。我会让你自己解决这个问题(不是很复杂,here's that link again我给了你。继续检查,查看发送到服务器的所有参数及其代表的内容。
  9. 请记住,从现在开始的任何其他实施都是在您身上,您将无法自动运行任何内容。您必须自己配置的所有功能。
  10. 就像我之前说过的那样,看起来似乎有很多工作,但事实并非如此,而且灵活性确实得到了回报。祝好运!希望你能找到这个有用的=]

    <强>更新

    手动整合的一般例子确实缺乏。我花时间在这里写了一个django-snippet:https://djangosnippets.org/snippets/3019/。它以非常简化的格式包括dataTables的所有常见实现(包括排序等),包括一些管理员风格的预定义(我认为这很好)。

答案 1 :(得分:0)

您需要设置"bPaginate" : false,因为它默认设置为true。