Media dinamici locale-aware e reset paginazione nel filtro

- I media di jQuery/select2/autocomplete sono derivati dal widget
  AutocompleteSelect invece che da una lista hard-coded: si caricano i
  percorsi corretti per la versione di Django e la traduzione del select2
  nella lingua attiva (prima veniva forzata la i18n turca, lasciando il
  widget in inglese).
- Il JS esclude il parametro "p" nella ricostruzione della querystring:
  cambiando filtro la paginazione torna a pagina 1, come i link filtro
  standard dell'admin, evitando "pagina senza risultati".
This commit is contained in:
2026-06-19 17:39:43 +02:00
parent 6dcbf7fdea
commit 55a1592ac4
2 changed files with 23 additions and 17 deletions
+19 -16
View File
@@ -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']},
)
@@ -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)
}
}