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:
+21
-10
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user