@@ -14,39 +14,31 @@ def __init__(self, field, request, params, model, model_admin, field_path):
1414 super ().__init__ (field , request , params , model , model_admin , field_path )
1515
1616 self .lookup_val = self .used_parameters .get (self .lookup_kwarg , [])
17- if len (self .lookup_val ) == 1 and self .lookup_val [0 ] == "" :
17+ if len (self .lookup_val ) == 1 and ( self .lookup_val [0 ] == [ "" ] or self . lookup_val [ 0 ] == "" ) :
1818 self .lookup_val = []
19- elif len (self .lookup_val ) == 1 and type (self .lookup_val [0 ]) != str :
20- # In Django 5.0, we get an extra list
19+ elif len (self .lookup_val ) == 1 and not isinstance (self .lookup_val [0 ], str ):
2120 self .lookup_val = self .lookup_val [0 ]
2221 self .lookup_val_isnull = self .used_parameters .get (self .lookup_kwarg_isnull )
2322
2423 self .empty_value_display = model_admin .get_empty_value_display ()
2524 parent_model , reverse_path = reverse_field_path (model , field_path )
26- # Obey parent ModelAdmin queryset when deciding which options to show
25+
2726 if model == parent_model :
2827 queryset = model_admin .get_queryset (request )
2928 else :
3029 queryset = parent_model ._default_manager .all ()
31- self .lookup_choices = (
32- queryset .distinct ().order_by (field .name ).values_list (field .name , flat = True )
33- )
30+ self .lookup_choices = queryset .distinct ().order_by (field .name ).values_list (field .name , flat = True )
3431 self .field_verboses = {}
3532 if self .field .choices :
36- self .field_verboses = {
37- field_value : field_verbose
38- for field_value , field_verbose in self .field .choices
39- }
33+ self .field_verboses = {field_value : field_verbose for field_value , field_verbose in self .field .choices }
4034
4135 def expected_parameters (self ):
4236 return [self .lookup_kwarg , self .lookup_kwarg_isnull ]
4337
4438 def choices (self , changelist ):
4539 yield {
4640 "selected" : not self .lookup_val and self .lookup_val_isnull is None ,
47- "query_string" : changelist .get_query_string (
48- remove = [self .lookup_kwarg , self .lookup_kwarg_isnull ]
49- ),
41+ "query_string" : changelist .get_query_string (remove = [self .lookup_kwarg , self .lookup_kwarg_isnull ]),
5042 "display" : _ ("All" ),
5143 }
5244 include_none = False
@@ -73,18 +65,14 @@ def choices(self, changelist):
7365 else :
7466 yield {
7567 "selected" : val in self .lookup_val ,
76- "query_string" : changelist .get_query_string (
77- remove = [self .lookup_kwarg ]
78- ),
68+ "query_string" : changelist .get_query_string (remove = [self .lookup_kwarg ]),
7969 "display" : self .field_verboses .get (val , val ),
8070 }
8171
8272 if include_none :
8373 yield {
8474 "selected" : bool (self .lookup_val_isnull ),
85- "query_string" : changelist .get_query_string (
86- {self .lookup_kwarg_isnull : "True" }, [self .lookup_kwarg ]
87- ),
75+ "query_string" : changelist .get_query_string ({self .lookup_kwarg_isnull : "True" }, [self .lookup_kwarg ]),
8876 "display" : self .empty_value_display ,
8977 }
9078
@@ -94,20 +82,18 @@ def __init__(self, field, request, params, model, model_admin, field_path):
9482 super ().__init__ (field , request , params , model , model_admin , field_path )
9583 self .lookup_kwarg = "%s__%s__in" % (field_path , field .target_field .name )
9684 self .lookup_kwarg_isnull = "%s__isnull" % field_path
97- values = params .get (self .lookup_kwarg , [])
98- if len (values ) == 1 and type (values [0 ]) != str :
99- # In Django 5.0, we get an extra list
100- values = values [0 ]
101- self .lookup_val = values .split ("," ) if values else []
85+
86+ values = request .GET .getlist (self .lookup_kwarg )
87+ if len (values ) == 1 and "," in values [0 ]:
88+ values = values [0 ].split ("," )
89+ self .lookup_val = [str (value ) for value in values if value ]
90+
10291 self .lookup_choices = self .field_choices (field , request , model_admin )
10392
10493 def choices (self , changelist ):
10594 yield {
106- "selected" : (self .lookup_val is None or self .lookup_val == [])
107- and not self .lookup_val_isnull ,
108- "query_string" : changelist .get_query_string (
109- remove = [self .lookup_kwarg , self .lookup_kwarg_isnull ]
110- ),
95+ "selected" : (self .lookup_val is None or self .lookup_val == []) and not self .lookup_val_isnull ,
96+ "query_string" : changelist .get_query_string (remove = [self .lookup_kwarg , self .lookup_kwarg_isnull ]),
11197 "display" : _ ("All" ),
11298 }
11399
@@ -123,8 +109,7 @@ def choices(self, changelist):
123109 values = self .lookup_val + [str (pk_val )]
124110
125111 yield {
126- "selected" : self .lookup_val is not None
127- and str (pk_val ) in self .lookup_val ,
112+ "selected" : self .lookup_val is not None and str (pk_val ) in self .lookup_val ,
128113 "query_string" : changelist .get_query_string (
129114 {self .lookup_kwarg : "," .join (values )}, [self .lookup_kwarg_isnull ]
130115 ),
@@ -134,9 +119,7 @@ def choices(self, changelist):
134119 if self .include_empty_choice :
135120 yield {
136121 "selected" : bool (self .lookup_val_isnull ),
137- "query_string" : changelist .get_query_string (
138- {self .lookup_kwarg_isnull : "True" }, [self .lookup_kwarg ]
139- ),
122+ "query_string" : changelist .get_query_string ({self .lookup_kwarg_isnull : "True" }, [self .lookup_kwarg ]),
140123 "display" : empty_title ,
141124 }
142125
@@ -153,11 +136,7 @@ def queryset(self, request, queryset):
153136 return queryset
154137
155138 queryset = queryset .alias (
156- nmatch = Count (
157- self .field_path ,
158- filter = Q (** {f'{ self .lookup_kwarg } ' : choices }),
159- distinct = True
160- )
139+ nmatch = Count (self .field_path , filter = Q (** {f"{ self .lookup_kwarg } " : choices }), distinct = True )
161140 ).filter (nmatch = choice_len )
162141 return queryset
163142
0 commit comments