diff --git a/djaa_list_filter/admin.py b/djaa_list_filter/admin.py index d3f3c0e..d07981b 100644 --- a/djaa_list_filter/admin.py +++ b/djaa_list_filter/admin.py @@ -6,6 +6,7 @@ import warnings from django import forms from django.contrib import admin from django.contrib.admin.widgets import AutocompleteSelect +from django.core.exceptions import FieldDoesNotExist from django.db.models.fields import BLANK_CHOICE_DASH from django.db.models.fields.related_descriptors import ( ManyToManyDescriptor, @@ -88,19 +89,21 @@ class AjaxAutocompleteListFilterModelAdmin(admin.ModelAdmin): self.list_filter = list_filter super().__init__(*args, **kwargs) - class Media: - js = [ - 'admin/js/vendor/jquery/jquery.js', - 'admin/js/vendor/select2/select2.full.js', - 'admin/js/vendor/select2/i18n/tr.js', - 'admin/js/jquery.init.js', - 'admin/js/autocomplete.js', - 'djaa_list_filter/admin/js/autocomplete_list_filter.js', - ] - css = { - 'screen': [ - 'admin/css/vendor/select2/select2.css', - 'admin/css/autocomplete.css', - 'djaa_list_filter/admin/css/autocomplete_list_filter.css', - ] - } + @property + def media(self): + # I media di jQuery/select2/autocomplete vengono derivati dinamicamente dal + # widget AutocompleteSelect di Django, invece di una lista hard-coded: in + # questo modo si caricano i percorsi corretti per la versione di Django e la + # traduzione (i18n) del select2 nella lingua attiva (la lista fissa caricava + # sempre la i18n turca, lasciando il widget in inglese). + media = super().media + for field_name in getattr(self, 'autocomplete_list_filter', []): + try: + field = self.model._meta.get_field(field_name) + except FieldDoesNotExist: + continue + media = media + AutocompleteSelect(field, self.admin_site).media + return media + forms.Media( + js=['djaa_list_filter/admin/js/autocomplete_list_filter.js'], + css={'screen': ['djaa_list_filter/admin/css/autocomplete_list_filter.css']}, + ) diff --git a/djaa_list_filter/static/djaa_list_filter/admin/js/autocomplete_list_filter.js b/djaa_list_filter/static/djaa_list_filter/admin/js/autocomplete_list_filter.js index 38562b2..0e34bb7 100644 --- a/djaa_list_filter/static/djaa_list_filter/admin/js/autocomplete_list_filter.js +++ b/djaa_list_filter/static/djaa_list_filter/admin/js/autocomplete_list_filter.js @@ -3,7 +3,10 @@ function handle_querystring_and_redirect(querystring_value, qs_target_value, sel if (querystring_value.length > 0) { for(const field_eq_value of querystring_value.split("&")){ var [field, value] = field_eq_value.split("="); - if (field != qs_target_value){ + // Si escludono il filtro corrente e "p": cambiando filtro la paginazione + // va resettata a pagina 1 (come fanno i link filtro standard dell'admin), + // altrimenti si rischia un "pagina senza risultati". + if (field != qs_target_value && field != "p"){ required_queryset.push(field_eq_value) } }