diff --git a/djaa_list_filter/admin.py b/djaa_list_filter/admin.py index 188d49d..b37bd17 100644 --- a/djaa_list_filter/admin.py +++ b/djaa_list_filter/admin.py @@ -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