Django:使用数据表

Posted

技术标签:

【中文标题】Django:使用数据表【英文标题】:Django: Using DataTables 【发布时间】:2013-08-29 15:17:32 【问题描述】:

我想使用 ajax 为我的表引入过滤和排序功能。根据我的发现,DataTables 似乎是最好的选择。但是,我似乎无法让它工作!我尝试的第一件事是使用它,就像他们在演示中设置它的方式一样。但是我无法缝合以生成搜索表单,并且排序也不起作用。然后,我尝试使用为实现该功能而创建的众多软件包之一。但是,我发现文档通常不是很清楚且难以遵循,或者即使我确实遵循了它,我也会留下表格渲染良好,但搜索和排序仍然不可用。所以我决定回到我原来的地方,看看是否有人可能知道我做错了什么。该页面确实正确呈现了表格,如果我查看页面源代码,则 javascript 已正确链接。

这里是html

<pre>
    <code>
        % extends "theme_bootstrap/base.html" %
        % load staticfiles %

        % block extra_style %
            <script src="% static "js/jquery.js" %"></script>
            <script src="% static "js/jquery.dataTables.js" %"></script>
            <script type="text/javascript" charset="utf-8">
                $(document).ready(function() 
                    $('#test').dataTable();
                );
            </script>
        % endblock %

        % block body %

             store.StoreName


            % if liquors.count > 0 %
                <h1>liquors</h1>

                <table id="test"> 
                    <thead>
                        <tr>
                            <th>Liquor Code</th>
                            <th>Brand Name</th>
                            <th>Vendor Name</th>
                        </tr>
                    </thead>
                    <tbody>
                        % for liquor in liquors %
                            <tr>
                                <td> liquor.LiquorCode </td>
                                <td><a href="/liquors/get/ a.StoreID / liquor.id /"> liquor.BrandName </a></td>
                                <td> liquor.VendorName </td>
                            </tr>
                        % endfor %
                    </tbody>
                </table>
            % else %
                <p>None to show!</p>
            % endif %
        % endblock %
    </code>
</pre>

这也是我的看法。也许我在这里做错了什么。

def liquors(request, store_id):
    args = 
    args.update(csrf(request))
    a = Store.objects.get(StoreID=store_id)  
    args['liquors'] = Liquor.objects.all()
    args['a'] = a

    return render(request, 'liquors.html', args)

【问题讨论】:

【参考方案1】:

我在不久前从事的一个项目中做到了这一点。以下是我在模板中定义表格的方式:

$(document).ready( function () 
            var ticketTable = $('#ticket-table').dataTable( 
                "fnDrawCallback": function() 
                    // Initialize popovers anytime new data is loaded into the table
                    $('a[rel=tooltip]').tooltip(
                        placement: 'left'
                    );
                ,
                "bServerSide": true,
                "bAutoWidth": false,
                "sPaginationType": "bootstrap",
                "sAjaxSource": "% url get_tickets_list %",
                "aaSorting": [[ 2, "desc" ]],
                "iPageLength": 25,
                "bLengthChange": false,
                "bStateSave": true,
                "bFilter": true,
                "sDom": "<'length-change'><'row'<'span6'l><'span6'f>r>t<'row'<'span6'i><'length-change'><'span6'p>>",
                "oLanguage": 
                    "sSearch": ""
                ,
                "aoColumns": [
                     "bSortable": false, "sWidth": "14px", "bSearchable": false ,
                     "sWidth": "160px", "bSearchable": true ,
                     "sWidth": "60px", "bSearchable": true ,
                     "bSearchable": true ,
                     "bSortable": false, "sWidth": "14px", "bSearchable": false ,
                     "sWidth": "50px", "sClass": "center", "bSearchable": false ,
                     "bSearchable": true ,
                     "sWidth": "70px", "sClass": "center", "bSearchable": false ,
                     "sWidth": "75px", "bSearchable": true 
                ]  ).fnSetFilteringDelay(500);

键是表选项中的这一行,它定义了来自 DataTable 的 AJAX 请求的源 URL:

"sAjaxSource": "% url get_tickets_list %",

然后,您还需要一个视图来返回 AJAX 请求:

def get_tickets_list(request, queryset=Ticket.objects.all()):
    """
    AJAX calls for DataTable ticket list.
    """

    #columnIndexNameMap is required for correct sorting behavior
    columnIndexNameMap =  0: 'link', 1 : 'created', 2: 'priority', 3: 'client', 4: 'client_email', 5: 'sites', 6: 'problem',7: 'updates', 8: 'state' 
    #path to template used to generate json (optional)
    jsonTemplatePath = 'json_tickets.txt'

    #call to generic function from utils
    return get_datatables_records(request, queryset, columnIndexNameMap, jsonTemplatePath)

正如我所说,这是不久前的事情,可能不再适用于最新版本的 DataTable,但也许它会让您朝着正确的方向前进。

【讨论】:

以上是关于Django:使用数据表的主要内容,如果未能解决你的问题,请参考以下文章

3-在Django中使用使用数据库

无论数据源如何,使用 Django/Django Rest Framework 验证和保存数据的正确过程是啥?

Django使用Mysql数据库已经存在的数据表方法

如何使用 django 将数据表值显示到主页中

Django:使用数据表

邂逅Django——数据库配置