Corregge l'ordine di caricamento del JS del filtro

Il JS del filtro va accodato agli asset del widget nella stessa lista Media,
non in un forms.Media separato: aggiunto a parte, il merge di Django lo
collocava prima di jquery.init.js (django.jQuery non ancora definito) e gli
handler non si agganciavano, quindi selezionando dalla tendina il filtro non
veniva applicato. Regressione introdotta in 55a1592.
This commit is contained in:
2026-06-21 14:30:22 +02:00
parent cf146c3b55
commit 0562aafd78
+21 -10
View File
@@ -99,19 +99,30 @@ class AjaxAutocompleteListFilterModelAdmin(admin.ModelAdmin):
@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
# I media di jQuery/select2/autocomplete sono derivati dal widget
# AutocompleteSelect di Django (percorsi corretti per la versione di Django e
# i18n di select2 nella lingua attiva, invece della i18n turca hard-coded).
#
# IMPORTANTE: il JS del filtro va messo nella STESSA lista, in coda agli asset
# del widget, NON in un forms.Media separato. Aggiunto a parte, l'algoritmo di
# merge di Django lo collocava prima di jquery.init.js (django.jQuery non
# ancora definito) e il filtro non si agganciava: selezionando dalla tendina
# non veniva applicato.
widget_js, widget_css = [], {}
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']},
# Gli asset sono identici per ogni campo autocomplete: ne basta uno.
wm = AutocompleteSelect(field, self.admin_site).media
widget_js = list(wm._js)
widget_css = {tipo: list(files) for tipo, files in wm._css.items()}
break
css = dict(widget_css)
css['screen'] = css.get('screen', []) + ['djaa_list_filter/admin/css/autocomplete_list_filter.css']
extra = forms.Media(
js=widget_js + ['djaa_list_filter/admin/js/autocomplete_list_filter.js'],
css=css,
)
return super().media + extra