Changeset 3136
- Timestamp:
- 06/16/06 14:42:06 (2 years ago)
- Files:
-
- django/trunk/django/contrib/admin/filterspecs.py (modified) (9 diffs)
- django/trunk/django/contrib/admin/views/main.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/trunk/django/contrib/admin/filterspecs.py
r2809 r3136 12 12 class FilterSpec(object): 13 13 filter_specs = [] 14 def __init__(self, f, request, params ):14 def __init__(self, f, request, params, model): 15 15 self.field = f 16 16 self.params = params 17 17 18 18 def register(cls, test, factory): 19 cls.filter_specs.append( (test, factory))19 cls.filter_specs.append((test, factory)) 20 20 register = classmethod(register) 21 21 22 def create(cls, f, request, params ):22 def create(cls, f, request, params, model): 23 23 for test, factory in cls.filter_specs: 24 24 if test(f): 25 return factory(f, request, params )25 return factory(f, request, params, model) 26 26 create = classmethod(create) 27 27 … … 49 49 50 50 class RelatedFilterSpec(FilterSpec): 51 def __init__(self, f, request, params ):52 super(RelatedFilterSpec, self).__init__(f, request, params )51 def __init__(self, f, request, params, model): 52 super(RelatedFilterSpec, self).__init__(f, request, params, model) 53 53 if isinstance(f, models.ManyToManyField): 54 54 self.lookup_title = f.rel.to._meta.verbose_name … … 72 72 pk_val = getattr(val, self.field.rel.to._meta.pk.attname) 73 73 yield {'selected': self.lookup_val == str(pk_val), 74 'query_string': cl.get_query_string( {self.lookup_kwarg: pk_val}),74 'query_string': cl.get_query_string({self.lookup_kwarg: pk_val}), 75 75 'display': val} 76 76 … … 78 78 79 79 class ChoicesFilterSpec(FilterSpec): 80 def __init__(self, f, request, params ):81 super(ChoicesFilterSpec, self).__init__(f, request, params )80 def __init__(self, f, request, params, model): 81 super(ChoicesFilterSpec, self).__init__(f, request, params, model) 82 82 self.lookup_kwarg = '%s__exact' % f.name 83 83 self.lookup_val = request.GET.get(self.lookup_kwarg, None) … … 85 85 def choices(self, cl): 86 86 yield {'selected': self.lookup_val is None, 87 'query_string': cl.get_query_string( {}, [self.lookup_kwarg]),87 'query_string': cl.get_query_string({}, [self.lookup_kwarg]), 88 88 'display': _('All')} 89 89 for k, v in self.field.choices: 90 90 yield {'selected': str(k) == self.lookup_val, 91 'query_string': cl.get_query_string( {self.lookup_kwarg: k}),91 'query_string': cl.get_query_string({self.lookup_kwarg: k}), 92 92 'display': v} 93 93 … … 95 95 96 96 class DateFieldFilterSpec(FilterSpec): 97 def __init__(self, f, request, params ):98 super(DateFieldFilterSpec, self).__init__(f, request, params )97 def __init__(self, f, request, params, model): 98 super(DateFieldFilterSpec, self).__init__(f, request, params, model) 99 99 100 100 self.field_generic = '%s__' % self.field.name … … 124 124 for title, param_dict in self.links: 125 125 yield {'selected': self.date_params == param_dict, 126 'query_string': cl.get_query_string( param_dict, self.field_generic),126 'query_string': cl.get_query_string(param_dict, self.field_generic), 127 127 'display': title} 128 128 … … 130 130 131 131 class BooleanFieldFilterSpec(FilterSpec): 132 def __init__(self, f, request, params ):133 super(BooleanFieldFilterSpec, self).__init__(f, request, params )132 def __init__(self, f, request, params, model): 133 super(BooleanFieldFilterSpec, self).__init__(f, request, params, model) 134 134 self.lookup_kwarg = '%s__exact' % f.name 135 135 self.lookup_kwarg2 = '%s__isnull' % f.name … … 143 143 for k, v in ((_('All'), None), (_('Yes'), '1'), (_('No'), '0')): 144 144 yield {'selected': self.lookup_val == v and not self.lookup_val2, 145 'query_string': cl.get_query_string( {self.lookup_kwarg: v}, [self.lookup_kwarg2]),145 'query_string': cl.get_query_string({self.lookup_kwarg: v}, [self.lookup_kwarg2]), 146 146 'display': k} 147 147 if isinstance(self.field, models.NullBooleanField): 148 148 yield {'selected': self.lookup_val2 == 'True', 149 'query_string': cl.get_query_string( {self.lookup_kwarg2: 'True'}, [self.lookup_kwarg]),149 'query_string': cl.get_query_string({self.lookup_kwarg2: 'True'}, [self.lookup_kwarg]), 150 150 'display': _('Unknown')} 151 151 152 152 FilterSpec.register(lambda f: isinstance(f, models.BooleanField) or isinstance(f, models.NullBooleanField), BooleanFieldFilterSpec) 153 154 # This should be registered last, because it's a last resort. For example, 155 # if a field is eligible to use the BooleanFieldFilterSpec, that'd be much 156 # more appropriate, and the AllValuesFilterSpec won't get used for it. 157 class AllValuesFilterSpec(FilterSpec): 158 def __init__(self, f, request, params, model): 159 super(AllValuesFilterSpec, self).__init__(f, request, params, model) 160 self.lookup_val = request.GET.get(f.name, None) 161 self.lookup_choices = model._meta.admin.manager.distinct().order_by(f.name).values(f.name) 162 163 def title(self): 164 return self.field.verbose_name 165 166 def choices(self, cl): 167 yield {'selected': self.lookup_val is None, 168 'query_string': cl.get_query_string({}, [self.field.name]), 169 'display': _('All')} 170 for val in self.lookup_choices: 171 val = str(val[self.field.name]) 172 yield {'selected': self.lookup_val == val, 173 'query_string': cl.get_query_string({self.field.name: val}), 174 'display': val} 175 FilterSpec.register(lambda f: True, AllValuesFilterSpec) django/trunk/django/contrib/admin/views/main.py
r3070 r3136 575 575 for field_name in self.lookup_opts.admin.list_filter] 576 576 for f in filter_fields: 577 spec = FilterSpec.create(f, request, self.params )577 spec = FilterSpec.create(f, request, self.params, self.model) 578 578 if spec and spec.has_output(): 579 579 filter_specs.append(spec)
