@@ -419,6 +419,39 @@ def choices(self):
419419 'display' : EMPTY_CHANGELIST_VALUE ,
420420 }
421421
422+ @manager .register
423+ class MultiSelectFieldListFilter (ListFieldFilter ):
424+ """ Delegates the filter to the default filter and ors the results of each
425+
426+ Lists the distinct values of each field as a checkbox
427+ Uses the default spec for each
428+
429+ """
430+ template = 'xadmin/filters/checklist.html'
431+ lookup_formats = {'in' : '%s__in' }
432+
433+ @classmethod
434+ def test (cls , field , request , params , model , admin_view , field_path ):
435+ return True
436+
437+ def __init__ (self , field , request , params , model , model_admin , field_path ):
438+ super (MultiSelectFieldListFilter ,self ).__init__ (field , request , params , model , model_admin , field_path )
439+ self .lookup_choices = [x [0 ] for x in self .admin_view .queryset ().order_by (field_path ).values_list (field_path ).distinct ().exclude (** {"%s__isnull" % field_path :True }) if str (x [0 ]).strip ()!= "" ]#field.get_choices(include_blank=False)
440+
441+ def choices (self ):
442+ self .lookup_in_val = (type (self .lookup_in_val ) in (tuple ,list )) and self .lookup_in_val or list (self .lookup_in_val )
443+ yield {
444+ 'selected' : len (self .lookup_in_val ) == 0 ,
445+ 'query_string' : self .query_string ({},[self .lookup_in_name ]),
446+ 'display' : _ ('All' ),
447+ }
448+ for val in self .lookup_choices :
449+ yield {
450+ 'selected' : smart_unicode (val ) in self .lookup_in_val ,
451+ 'query_string' : self .query_string ({self .lookup_in_name : "," .join ([val ]+ self .lookup_in_val ),}),
452+ 'remove_query_string' : self .query_string ({self .lookup_in_name : "," .join ([v for v in self .lookup_in_val if v != val ]),}),
453+ 'display' : val ,
454+ }
422455
423456@manager .register
424457class AllValuesFieldListFilter (ListFieldFilter ):
0 commit comments