我使用的是BaseDatatableView和DataTable jQuery.我已经为BaseDatatableView编写了几个视图,在我必须重写‘Prepare_Result’和‘Render_Column’方法之前没有任何问题.我需要在表中显示实例方法的结果,因此我覆盖了BaseDatatableView类的方法.
这是我在views.py中的代码
class MyModelDatatable(BaseDatatableView):
model = MyModel
columns = ['field1', 'field2', 'id']
columns_searched = [col for col in columns if col != 'id']
def get_initial_queryset(self):
return self.model.objects.all()
def filter_queryset(self, qs):
print('test') # not displayed
search_text = self.request.GET.get('search[value]', None)
if search_text:
search_terms = search_text.split()
query = Q()
for col in self.columns_searched:
or_conditions = Q()
for term in search_terms:
or_conditions |= Q(**{f'{col}__icontains': term})
query |= or_conditions
qs = qs.filter(query)
return qs
def prepare_results(self, qs):
data = []
for item in qs:
item_str = str(item)
data.append({
'field1': item_str,
'field2': item.field2,
'id': item.id
})
return data
def render_column(self, row, column):
if column == 'field2':
return row.field2.strftime('%Y-%m-%d')
return super(OrderDatatable, self).render_column(row, column)
def get(self, request, *args, **kwargs):
return self.get_json_response()
def get_json_response(self):
draw = int(self.request.GET.get('draw', 1))
total_records = self.get_initial_queryset().count()
total_display_records = total_records
start = int(self.request.GET.get('start', 0))
length = int(self.request.GET.get('length', 10))
end = start + length
data = self.prepare_results(self.get_initial_queryset()[start:end])
response = {
'draw': draw,
'recordsTotal': total_records,
'recordsFiltered': total_display_records,
'data': data,
}
return JsonResponse(response)
ObjDatable.js
$(document).ready(function () {
const table = $('#my-datatable').DataTable({
'columns': [
{'data': 'field1'},
{'data': 'field2'},
{
'data': 'id',
'render': function (data, type, row) {
let actionButtons = `
<a href='/edit/${data}'
class="btn btn-datatable btn-icon btn-transparent-dark me-2">
<i data-feather="edit"></i>
</a>
`;
return actionButtons;
}
},
],
'paging': true,
'pageLength': 20,
'lengthMenu': [5, 10, 20, 30, 50, 100, 200],
'pagingType': 'full_numbers',
'processing': true,
'serverSide': true,
'ajax': {
'url': 'orders_datatable_search/',
}
});
table.on('draw.dt', function () {
feather.replace();
})
});
使用不带方法重写的标准类字段,筛选可以正常工作.覆盖后,所有内容都正常工作,包括分页,但不进行过滤.