From ff398d8e7f0567c32678c9cf1badfc03c068b73a Mon Sep 17 00:00:00 2001 From: bkfox Date: Thu, 5 May 2022 17:15:06 +0200 Subject: [PATCH] add url & make it work --- aircox/admin/filters.py | 33 ++++++++++++++----- .../admin/aircox/filters/date_filter.html | 14 ++++++-- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/aircox/admin/filters.py b/aircox/admin/filters.py index 129d777..ff70203 100644 --- a/aircox/admin/filters.py +++ b/aircox/admin/filters.py @@ -1,6 +1,7 @@ from django.db import models from django.contrib.admin import filters from django.utils.translation import gettext_lazy as _ +from django.utils.http import urlencode __all__ = ('DateFieldFilter', 'DateTimeField') @@ -15,25 +16,41 @@ class DateFieldFilter(filters.FieldListFilter): self.field_generic = '%s__' % field_path self.date_params = {k: v for k, v in params.items() if k.startswith(self.field_generic)} - self.links = ((_('Exact'), self.field_generic + 'exact'), - (_('Since'), self.field_generic + 'gte'), - (_('Until'), self.field_generic + 'lte')) + + # links as: (label, param, input_type|None, value) + self.links = [(_('Exact'), self.field_generic + 'exact', self.input_type), + (_('Since'), self.field_generic + 'gte', self.input_type), + (_('Until'), self.field_generic + 'lte', self.input_type)] + if field.null: + self.links.insert(0, (_('None'), self.field_generic + 'isnull', None, '1')) + + self.query_attrs = {k:v for k,v in request.GET.items() + if k not in self.date_params} + self.query_string = urlencode(self.query_attrs) super().__init__(field, request, params, model, model_admin, field_path) def expected_parameters(self): return [link[1] for link in self.links] def choices(self, changelist): + yield {'label': _('Any'), + 'type': None, + 'query_string': self.query_string} + for link in self.links: - yield {'label': link[0], - 'name': link[1], - 'value': self.date_params.get(link[1]), - 'type': self.input_type,} + value = len(link) > 3 and link[3] or self.date_params.get(link[1]) + yield { + 'label': link[0], 'name': link[1], 'value': value, + 'type': link[2], + 'query_attrs': self.query_attrs, + 'query_string': urlencode({link[1]: value}) + '&' + self.query_string + if value else self.query_string, + } class DateTimeFieldFilter(DateFieldFilter): """ Display datetime input """ - input_type = 'datetime' + input_type = 'datetime-local' filters.FieldListFilter.register( diff --git a/aircox/templates/admin/aircox/filters/date_filter.html b/aircox/templates/admin/aircox/filters/date_filter.html index e600c4b..a176b95 100644 --- a/aircox/templates/admin/aircox/filters/date_filter.html +++ b/aircox/templates/admin/aircox/filters/date_filter.html @@ -5,14 +5,22 @@ {% block content %} {% endblock %}