Я успешно отфильтровал данные в форме диапазона дат с этим кодом ниже. Но есть некоторые препятствия, когда предполагаемый фильтр даты не инкапсулирован. Таким образом, фильтр данных оказывает общее влияние на пользователей, даже анонимных пользователей. Таким образом, при возврате на домашнюю страницу и последующем возврате на страницу данных объект фильтра не возвращается к нормальному состоянию, но все еще с предыдущими данными фильтра. Как я могу сделать эти объекты фильтра действительными только в каждом сеансе в 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>