Django Datatatatatatatatatatatatatatatatatatatable (datatable. net) с данными в ajax, необходимо фильтровать данные с помощью формы - PullRequest
0 голосов
/ 10 февраля 2020

Я успешно отфильтровал данные в форме диапазона дат с этим кодом ниже. Но есть некоторые препятствия, когда предполагаемый фильтр даты не инкапсулирован. Таким образом, фильтр данных оказывает общее влияние на пользователей, даже анонимных пользователей. Таким образом, при возврате на домашнюю страницу и последующем возврате на страницу данных объект фильтра не возвращается к нормальному состоянию, но все еще с предыдущими данными фильтра. Как я могу сделать эти объекты фильтра действительными только в каждом сеансе в django, а также сбросить эти объекты фильтра, возвращающиеся в нормальное состояние (сброс), когда они выходят из этой страницы данных. строка:

# was forced to do this because only this way i can filter the data succeed.
# the problem is filter object data can not encapsulated to unique session.
x = JurnalListViewAjax
x.last_day_in_month = end
x.first_day_in_month_date = start

views.py

class JurnalListViewAjax(generic.View):
    obj = models.Jurnal.objects
    # last_day_in_month = timezone.datetime(2017, 8, 31).date()
    # first_day_in_month_date = timezone.datetime(2017, 8, 1).date()

    last_day_in_month = timezone.now().date()
    first_day_in_month_date = last_day_in_month.replace(day=1)

    def post(self, request):
        jurnal = self._datatables(request)
        return HttpResponse(json.dumps(jurnal, cls=DjangoJSONEncoder), content_type='application/json')

    def _datatables(self, request):
        datatables = request.POST
        draw = int(datatables.get('draw'))
        start = int(datatables.get('start'))
        length = int(datatables.get('length'))
        search = datatables.get('search[value]')

        if self.obj.all().filter(dateday__range=[
            self.first_day_in_month_date, self.last_day_in_month]
        ).exists():
            jurnals = self.obj.all().filter(
                dateday__range=[self.first_day_in_month_date, self.last_day_in_month]
            ).values(
                'id', 'code__name', 'dateday', 'description',
                'debit', 'credit', 'slug',
            )

            records_total = jurnals.count()
            records_filtered = records_total

            start_record = jurnals.last().get('id')

            if search:
                jurnals = jurnals.filter(
                    Q(id__startswith=search) |
                    Q(description__icontains=search)
                )
                records_total = jurnals.count()
                records_filtered = records_total

        else:
            jurnals = [{
                'id': -1, 'code__name': 'no data', 'dateday': '...', 'description': 'no data',
                'debit': 'no data', 'credit': 'no data', 'slug': '../data.html'
            },]
            start_record = 0
            records_total = 0
            records_filtered = 0

        # Atur paginator
        paginator = Paginator(jurnals, length)
        page_number = int(start / length + 1)

        try:
            object_list = paginator.page(page_number).object_list
        except PageNotAnInteger:
            object_list = paginator.page(1).object_list
        except EmptyPage:
            object_list = paginator.page(1).object_list
        data = [
            {
                'id': item.get('id') + 1 - start_record,
                'kode_akun': item.get('code__name'),
                'dateday': item.get('dateday'),
                'description': item.get('description'),
                'debit': item.get('debit'),
                'credit': item.get('credit'),
                'slug': item.get('slug'),
            } for item in object_list
        ]

        return {
            'draw': draw,
            'recordsTotal': records_total,
            'recordsFiltered': records_filtered,
            'data': data,
        }


def jurnalweb_list(request):
    context = dict()
    form = forms.JurnalFilterForm(request.POST or None)
    if form.is_valid():
        data = form.clean()
        start = data.get('start')
        end = data.get('end')
        context['dateday'] = {
            'start': start,
            'end': end,
        }

        x = JurnalListViewAjax
        x.last_day_in_month = end
        x.first_day_in_month_date = start

    context['form'] = form

    return render(request, "accounting/jurnal_with_ajax_list.html", context)

urls.py в приложении

urlpatterns = (
    path("api/v1/", include(router.urls)),
    path("accounting/jurnal/data.html", jurnal.jurnalweb_list, name="accounting_jurnal_ajax_data"),
    path("accounting/jurnal/ajax/", jurnal.JurnalListViewAjax.as_view(), name="accounting_jurnal_ajax"),
)

JS в html

<script>
  $(function () {
    $('#jurnal1').DataTable({
      "processing": true,
      "serverSide": true,
      "ajax": {
          "url": "{% url 'accounting_jurnal_ajax' %}",
          "type": "POST",
          "data": {
            "csrfmiddlewaretoken": "{{ csrf_token }}"
        }
      },
      "paging": true,
      "pagingType": "full_numbers",
      "lengthChange": true,
      "searching": true,
      "ordering": false,
      "info": true,
      "autoWidth": false,

      "columns": [
            { "data": "id" },
            { "data": "code__name" },
            { "data": "dateday" },
            { "data": "description"},
            {
                "data": "debet", className: "curr_jurnal1",
                render: $.fn.dataTable.render.number( '.', ',', 0, '$ ' )
            },
            {
                "data": "kredit", className: "curr_jurnal1",
                render: $.fn.dataTable.render.number( '.', ',', 0, '$ ' )
            },
           {
               "data":"slug"
           }
        ],
      columnDefs: [
            {
                render: function (data, type, full, meta) {
                    return "<a href='detail/"+ data + "' > detail </div>";
                },
                targets: 6
            },
            { "width": "15%", "targets": 4},
            { "width": "15%", "targets": 5},
            { "width": "5%", "targets": 0},
            { "width": "10%", "targets": 2}
        ]


    });
  });

</script>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...