#5833: Custom FilterSpecs
-------------------------------------------+--------------------------------
Reporter: Honza_Kral | Owner: jkocherhans
Status: assigned | Milestone:
Component: django.contrib.admin | Version: SVN
Resolution: | Keywords: nfa-someday list_filter filterspec nfa-changelist ep2008
Stage: Accepted | Has_patch: 1
Needs_docs: 1 | Needs_tests: 1
Needs_better_patch: 0 |
-------------------------------------------+--------------------------------
Comment (by bendavis78):
It seems that the latest patch did not support using a "field-less"
filterspec. The validation was failing because it was still expecting a
field. I've attached a patch against 1.2.1 that works for me. If anyone
involved could please test this out, that would be great.
We need some docs and tests for this -- it'd be nice to see this added to
1.3. Although, it would be good to get some feedback from the core devs
to make sure this is going in the right direction.
In the meantime, here's a silly little example of how a custom non-field-
specific filterspec can be used (in case anyone wants to play around with
it).
{{{
#!python
from testapp import models
from django.contrib.admin.filterspecs import FilterSpec
from django.contrib import admin
from django.utils.datastructures import SortedDict
class HowYummyFilterSpec(FilterSpec):
def __init__(self, request, params, model, model_admin):
super(HowYummyFilterSpec, self).__init__(request, params, model,
model_admin)
self.links = SortedDict((
('All', 'all'),
('Double Rainbow', 'so_intense'),
('Pretty good', 'good'),
('Not great', 'not_great'),
('Gross', 'gross'),
))
def consumed_params(self):
return self.links.values()
def choices(self, cl):
selected = [v for v in self.links.values() if
self.params.has_key(v)]
for title, key in self.links.items():
yield {'selected': self.params.has_key(key),
'query_string': cl.get_query_string({key:1}, selected),
'display': title}
def get_query_set(self, cls, qs):
if self.params.has_key('so_intense'):
return qs.filter(name__icontains='bacon')
if self.params.has_key('good'):
return qs.filter(name__icontains='burger')
if self.params.has_key('not_great'):
return qs.filter(name__icontains='haggas')
if self.params.has_key('gross'):
return qs.filter(name__icontains='guano')
return qs
def title(self):
return u'How yummy?'
class FoodAdmin(admin.ModelAdmin):
list_filter = [HowYummyFilterSpec]
admin.site.register(models.Food, FoodAdmin)
}}}
--
Ticket URL: <
http://code.djangoproject.com/ticket/5833#comment:68>