我正在使用Django Rest Framework,django-filters和Datatables过滤并在表上显示数据。
我的问题是,ajax调用的URL不是我期望的。
代替类似的东西
/?date_from_day=8&date_from_month=5&date_from_year=1960&date_to_day=11&date_to_month=8&date_to_year=2018
我得到类似的东西
?0=d&1=a&2=t&3=e&4=_&5=f&6=r&7=o&8=m&9=_&10=d&11=a&12=y&13=%3D&14=8....
实际上是
?date_from_day=8
上面是情况的要点,下面我将介绍一些代码并解释发生的情况。
更多详细信息和代码
我们有一个drf视图,该视图通过过滤器返回所需的数据。 过滤有点麻烦,我已经重写了list方法,因为它是Datatable和服务器处理所必需的。
class FilteredProductsListAPIView(LoginRequiredMixin, ListAPIView):
authentication_classes = (authentication.SessionAuthentication,)
permission_classes = (permissions.IsAuthenticated,)
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_backends = (filters.DjangoFilterBackend,)
filterset_class = ProductFilter
def get_queryset(self):
qs = Product.objects.filter(user=self.request.user).order_by("-timestamp")
date_from_day = self.request.query_params.get("date_from_day", None)
date_from_month = self.request.query_params.get("date_from_month", None)
date_from_year = self.request.query_params.get("date_from_year", None)
if date_from_day and date_from_month and date_from_year:
date_from = datetime.date(int(date_from_year), int(date_from_month), int(date_from_day))
qs = qs.filter(date__gte=date_from)
# some more ugly code
return qs
def list(self, request, *args, **kwargs):
queryset = self.get_queryset()
total_count = queryset.count()
draw = int(self.request.GET["draw"], 0)
start = int(self.request.GET["start"], 0)
length = int(self.request.GET["length"], 0)
queryset = queryset[start:start+length]
serializer = ProductSerializer(queryset, many=True)
result = {"draw": draw,
"recordsTotal": total_count,
"recordsFiltered": total_count,
"data": serializer.data}
print("result:", result)
return Response(result)
我拨打电话的网址是这样:
url(r"^my-filtered-products/",
views.FilteredProductsListAPIView.as_view(), name="filter-products"),
对于数据表,我的页面中有以下html表:
<table class="table table-striped table-sm table-bordered" id="exampleAjax3">
<thead>
<tr>
<th></th>
<th>Date</th>
<th>Time</th>
<th>Title</th>
<th>Description</th>
<th>Price</th>
<th></th>
</tr>
</thead>
<tbody></tbody>
</table>
我使用ajax获取数据并呈现表:
function applyFilters(event) {
event.preventDefault();
var productFiltersForm = $(".my-product-filters-form");
$('#exampleAjax3').dataTable( {
"autoWidth": true,
"displayLength": 10,
"lengthChange": false,
"ordering": false,
"processing": false, // Show/Hide Processing message
"searching": false,
"serverSide": true,
"language": {
"zeroRecords": "Nothing to display",
"info": "Showing _START_ to _END_ of _TOTAL_ products",
"infoEmpty": ""
},
"ajax": {
"processing": false, // Show/Hide Processing message
"type": 'GET',
"url": '/my-filtered-products/',
"data": $(".my-product-filters-form").serialize(),
"dataSrc": "data"
},
"columns": [
{ "data": "date" },
{ "data": "time" },
{ "data": "description" },
{ "data": "price" }],
retrieve: true
});
}
序列化表格将返回:
date_from_day=8&date_from_month=5&date_from_year=1960&date_to_day=11&date_to_month=8&date_to_year=2018&odds_from=1.100&odds_to=10.000&stake_from=1.000&stake_to=234.340&sport_multi=4
在服务器端处理中使用数据表意味着对服务器的每个页面都请求数据。它发送一些参数: 绘制,开始和长度。
Datatables.net - Server-side processing
我认为进行请求的ajax调用分为两部分:过滤器一:
/?date_from_day=8&date_from_month=5&date_from_year=1960&date_to_day=11&date_to_month=8&date_to_year=2018,
在我看来,每个字符都已成为参数,并且Datatables部分的格式正确。
我已经正确地测试了,只是没有过滤器就可以返回过滤后的数据,可以通过数据表来获取数据并呈现表,而无需服务器端处理,一次即可。
它还可以用于数据表和服务器端处理,但可以对过滤器进行硬编码。
我认为错误在于ajax过程。也许我没有以正确的格式提供它。