【问题标题】:Django Rest Framework + Datatables + Class Based Views + Server Side ProcessingDjango Rest 框架 + 数据表 + 基于类的视图 + 服务器端处理
【发布时间】:2018-11-24 10:20:55
【问题描述】:

如何使用 Django Rest Framework + Datatables + 基于类的视图?

【问题讨论】:

  • 你想从我们这里听到什么?
  • 嘿,我的朋友,我回答了我自己的问题。这是一个对我有用的解决方案,可能会帮助其他人。为自己保留后现代主义的正确性。 @Chiefir

标签: django datatable datatables django-rest-framework


【解决方案1】:

这是一个使用 Django Rest Framework + Datatables + Class Based Views 的 Python 片段。

import re

from rest_framework.generics import GenericAPIView
from rest_framework.pagination import LimitOffsetPagination
from rest_framework.response import Response


class DataTablePagination(LimitOffsetPagination):  # pragma: no cover

    """Custom pagination class for datatable server side processing."""

    limit_query_param = "length"
    offset_query_param = "start"

    def get_paginated_response(self, data):
        """See datatables server side processing."""
        return Response({
            "recordsTotal": self.count,
            "recordsFiltered": self.count,
            "data": data,
            "draw": int(self.request.GET["draw"])
        })

    @staticmethod
    def get_datatable_ordering(request):
        """Parse datatables conf parameters."""
        ordering = []
        columns = dict()

        for key in request.GET:
            if key.startswith('columns'):
                col = dict()
                keys = [i[1:-1] for i in re.findall(r'\[\w+\]', key)]

                for i in range(len(keys) - 1):
                    if i == 0:
                        if keys[i] not in columns: columns[keys[i]] = dict()
                        col = columns[keys[i]]
                    else:
                        if keys[i] not in col: col[keys[i]] = dict()
                        col = col[keys[i]]

                col[keys[-1]] = request.GET[key]

        if 'order[0][column]' in request.GET:
            ret = columns[request.GET['order[0][column]']]['data']
            if request.GET['order[0][dir]'] != 'asc': ret = '-' + ret
            ordering.append(ret.replace('.', '__'))

        return ordering


class DatatablesView(GenericAPIView):  # pragma: no cover

    """Base view with datatables server side integration."""

    ordering = ("id",)

    def initialize_request(self, request, *args, **kwargs):
        """Enable server side processing for datatables and `q` searching."""
        request.GET = request.GET.copy()

        if 'draw' in request.GET:
            self.pagination_class = DataTablePagination
            self.ordering = self.pagination_class.get_datatable_ordering(
                request) or self.ordering

            if 'length' in request.GET and str(request.GET['length']) == '-1':
                request.GET['length'] = 1e9

            if 'search[value]' in request.GET:
                request.GET['search'] = request.GET['search[value]']

        elif 'q' in request.GET and 'search' not in request.GET:
            request.GET['search'] = request.GET['q']

        return super().initialize_request(request, *args, **kwargs)

【讨论】:

  • 您是如何使用编辑器@jsmedmar 解决图片上传问题的?我正在使用 drf-datatables-editor,但还没有上传。
猜你喜欢
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 2016-01-23
  • 2016-08-16
  • 1970-01-01
  • 2019-04-08
  • 2019-07-12
  • 2020-04-12
相关资源
最近更新 更多