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:
+19
-16
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user