Django数据表视图
django-datatables-view的Python项目详细描述
关于
django datatables视图是用于处理服务器端的基本视图 处理awesome数据表1.9.x,1.10.x (http://datatables.net)。
django datatables视图简化了排序、筛选和 创建json输出,定义如下: http://datatables.net/examples/server_side/
示例
使用django datatables视图的示例项目位于: https://bitbucket.org/pigletto/django-datatables-view-example/
用法
一。安装django datatables视图
pip install django-datatables-view
2.编辑视图.py
django_datatables_view使用genericviews,因此您的视图应该 只从基类继承:basedatatableview,并覆盖少数 事物(也有一个纯粹的反粒子处理器) 可以与你选择的混合料一起使用,例如Django支架。这些 是:
- model-应该用来填充数据表的模型
- 列-将要显示的列。如果没有 然后django_datatables_视图将在 数据表在请求中提供的列定义,例如: columndefs:[{name:'name',targets:[0]}(仅适用于数据表 1.10+
- order_columns-用于排序的列名列表(例如,if 用户在此列表中按第二列排序,然后按第二列名称排序 将与ORDER BY子句一起使用)。如果没有定义 django_datatables_view将在列中查找“name” 由数据表在请求中提供的定义,例如:columndefs: [{name:'name',targets:[0]}(仅适用于datatables 1.10+)
- filter\u queryset-如果您想在 然后用特定的方法重写此方法。如果是旧的数据表 (1.10之前)您需要重写此方法,否则将没有 过滤。
- filter_方法-默认情况下返回“istartswith” 重写它以使用不同的筛选方法,例如icontains:return 自过滤图标
对于更高级的定制,您可能需要覆盖:
- get_initial_queryset-应该返回所用queryset的方法 填充数据表
- 准备结果-此方法应返回列表(行)列表 带列)根据数据表的需要
- escape\u值-可以将此属性设置为false以便 不是render_column方法返回的转义值
代码相当简单,所以不要犹豫,看看它。 首先执行的方法(并调用其他方法执行 整个逻辑)是get_context_data。一定要看看这个 方法!
请参见下面的示例:
fromdjango_datatables_view.base_datatable_viewimportBaseDatatableViewfromdjango.utils.htmlimportescapeclassOrderListJson(BaseDatatableView):# The model we're going to showmodel=MyModel# define the columns that will be returnedcolumns=['number','user','state','created','modified']# define column names that will be used in sorting# order is important and should be same as order of columns# displayed by datatables. For non sortable columns use empty# value like ''order_columns=['number','user','state','','']# set max limit of records returned, this is used to protect our site if someone tries to attack our site# and make it return huge amount of datamax_display_length=500defrender_column(self,row,column):# We want to render user as a custom columnifcolumn=='user':# escape HTML for security reasonsreturnescape('{0} {1}'.format(row.customer_firstname,row.customer_lastname))else:returnsuper(OrderListJson,self).render_column(row,column)deffilter_queryset(self,qs):# use parameters passed in GET request to filter queryset# simple example:search=self.request.GET.get('search[value]',None)ifsearch:qs=qs.filter(name__istartswith=search)# more advanced example using extra parametersfilter_customer=self.request.GET.get('customer',None)iffilter_customer:customer_parts=filter_customer.split(' ')qs_params=Noneforpartincustomer_parts:q=Q(customer_firstname__istartswith=part)|Q(customer_lastname__istartswith=part)qs_params=qs_params|qifqs_paramselseqqs=qs.filter(qs_params)returnqs
三。编辑url.py
添加典型的django的urlconf条目:
url(r'^my/datatable/data/$',login_required(OrderListJson.as_view()),name='order_list_json'),
四。定义html+javascript
示例js:
$(document).ready(function(){varoTable=$('.datatable').dataTable({// ... "processing":true,"serverSide":true,"ajax":"{% url 'order_list_json' %}"});// ... });
views.py自定义的另一个示例
fromdjango_datatables_view.base_datatable_viewimportBaseDatatableViewfromdjango.utils.htmlimportescapeclassOrderListJson(BaseDatatableView):order_columns=['number','user','state']defget_initial_queryset(self):# return queryset used as base for futher sorting/filtering# these are simply objects displayed in datatable# You should not filter data returned here by any filter values entered by user. This is because# we need some base queryset to count total number of records.returnMyModel.objects.filter(something=self.kwargs['something'])deffilter_queryset(self,qs):# use request parameters to filter queryset# simple example:search=self.request.GET.get('search[value]',None)ifsearch:qs=qs.filter(name__istartswith=search)# more advanced examplefilter_customer=self.request.GET.get('customer',None)iffilter_customer:customer_parts=filter_customer.split(' ')qs_params=Noneforpartincustomer_parts:q=Q(customer_firstname__istartswith=part)|Q(customer_lastname__istartswith=part)qs_params=qs_params|qifqs_paramselseqqs=qs.filter(qs_params)returnqsdefprepare_results(self,qs):# prepare list with output column data# queryset is already paginated herejson_data=[]foriteminqs:json_data.append([escape(item.number),# escape HTML for security reasonsescape("{0} {1}".format(item.customer_firstname,item.customer_lastname)),# escape HTML for security reasonsitem.get_state_display(),item.created.strftime("%Y-%m-%d %H:%M:%S"),item.modified.strftime("%Y-%m-%d %H:%M:%S")])returnjson_data
又一个views.py自定义示例
此示例假定列和顺序列的列表是在 客户端(数据表),例如:
$(document).ready(function(){vardt_table=$('.datatable').dataTable({order:[[0,"desc"]],columnDefs:[{name:'name',orderable:true,searchable:true,targets:[0]},{name:'description',orderable:true,searchable:true,targets:[1]}],searching:true,processing:true,serverSide:true,stateSave:true,ajax:TESTMODEL_LIST_JSON_URL});});
classTestModelListJson(BaseDatatableView):model=TestModel