admin filter for date and datetime using <input>

This commit is contained in:
bkfox 2022-05-05 14:45:23 +02:00
parent 36f5ee8b44
commit e44b77d0b3
5 changed files with 30 additions and 19 deletions

View File

@ -1,3 +1,4 @@
from . import filters
from .article import ArticleAdmin from .article import ArticleAdmin
from .episode import DiffusionAdmin, EpisodeAdmin from .episode import DiffusionAdmin, EpisodeAdmin
from .log import LogAdmin from .log import LogAdmin

View File

@ -1,11 +1,13 @@
from django.db import models
from django.contrib.admin import filters from django.contrib.admin import filters
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
__all__ = ('DateFieldFilter',) __all__ = ('DateFieldFilter', 'DateTimeField')
class DateFieldFilter(filters.FieldListFilter): class DateFieldFilter(filters.FieldListFilter):
""" Display date input """
template = 'admin/aircox/filters/date_filter.html' template = 'admin/aircox/filters/date_filter.html'
input_type = 'date' input_type = 'date'
@ -13,7 +15,6 @@ class DateFieldFilter(filters.FieldListFilter):
self.field_generic = '%s__' % field_path self.field_generic = '%s__' % field_path
self.date_params = {k: v for k, v in params.items() self.date_params = {k: v for k, v in params.items()
if k.startswith(self.field_generic)} if k.startswith(self.field_generic)}
self.links = ((_('Exact'), self.field_generic + 'exact'), self.links = ((_('Exact'), self.field_generic + 'exact'),
(_('Since'), self.field_generic + 'gte'), (_('Since'), self.field_generic + 'gte'),
(_('Until'), self.field_generic + 'lte')) (_('Until'), self.field_generic + 'lte'))
@ -30,3 +31,14 @@ class DateFieldFilter(filters.FieldListFilter):
'type': self.input_type,} 'type': self.input_type,}
class DateTimeFieldFilter(DateFieldFilter):
""" Display datetime input """
input_type = 'datetime'
filters.FieldListFilter.register(
lambda f: isinstance(f, models.DateField), DateFieldFilter, take_priority=True)
filters.FieldListFilter.register(
lambda f: isinstance(f, models.DateTimeField), DateTimeFieldFilter, take_priority=True)

View File

@ -8,7 +8,6 @@ from django.utils.translation import gettext_lazy as _
from adminsortable2.admin import SortableInlineAdminMixin from adminsortable2.admin import SortableInlineAdminMixin
from ..models import Category, Comment, NavItem, Page, StaticPage from ..models import Category, Comment, NavItem, Page, StaticPage
from .filters import DateFieldFilter
__all__ = ('CategoryAdmin', 'PageAdmin', 'NavItemInline') __all__ = ('CategoryAdmin', 'PageAdmin', 'NavItemInline')
@ -83,7 +82,7 @@ class PageAdmin(BasePageAdmin):
list_display = BasePageAdmin.list_display + ('category',) list_display = BasePageAdmin.list_display + ('category',)
list_editable = BasePageAdmin.list_editable + ('category',) list_editable = BasePageAdmin.list_editable + ('category',)
list_filter = BasePageAdmin.list_filter + ('category', ('pub_date', DateFieldFilter)) list_filter = BasePageAdmin.list_filter + ('category', 'pub_date')
search_fields = ('category__title',) search_fields = ('category__title',)
fieldsets = deepcopy(BasePageAdmin.fieldsets) fieldsets = deepcopy(BasePageAdmin.fieldsets)

View File

@ -161,7 +161,8 @@ class Page(BasePage):
Category, models.SET_NULL, Category, models.SET_NULL,
verbose_name=_('category'), blank=True, null=True, db_index=True verbose_name=_('category'), blank=True, null=True, db_index=True
) )
pub_date = models.DateTimeField(blank=True, null=True) pub_date = models.DateTimeField(
_('publication date'), blank=True, null=True, db_index=True)
featured = models.BooleanField( featured = models.BooleanField(
_('featured'), default=False, _('featured'), default=False,
) )

View File

@ -1,20 +1,18 @@
{% extends "./filter.html" %} {% extends "./filter.html" %}
{% load static %} {% load static %}
{% block content %} {% block content %}
{% with choices|first as choice %}
<form method="GET">
<ul> <ul>
{% for choice in choices %} {% for choice in choices %}
<li> <div>
<label for="{{ choice.name }}">{{ choice.label }}</label> <form method="GET">
<input type="{{ choice.type }}" name="{{ choice.name }}" <label for="filter-{{ choice.name }}">{{ choice.label }}: </label>
<input id="filter-{{ choice.name }}" type="{{ choice.type }}" name="{{ choice.name }}"
value="{{ choice.value }}" {{ choice.extra }} /> value="{{ choice.value }}" {{ choice.extra }} />
</li> <button class="button"><img src="{% static "admin/img/search.svg" %}" /></button>
</form>
</div>
{% endfor %} {% endfor %}
</ul> </ul>
<div style="text-align: right;">
<input type="submit" value="Chercher">
</div>
</form>
{% endwith %}
{% endblock %} {% endblock %}