tickets: 8330
This data as json
id | created | changetime | last_pulled_from_trac | stage | status | component | type | severity | version | resolution | summary | description | owner | reporter | keywords | easy | has_patch | needs_better_patch | needs_tests | needs_docs | ui_ux |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
8330 | 2008-08-15 02:40:10 | 2008-08-15 02:45:29 | 2022-03-06 03:41:58.059140 | Unreviewed | closed | contrib.admin | dev | duplicate | Cannot add new filterspecs without modifining filterspecs.py | Adding your own filter specs works easily by simply using this code within an applications admin.py {{{ #!python from django.contrib.admin.filterspecs import FilterSpec class MyFilterSpec(FilterSpec): ... FilterSpec.register(...) }}} However, since the last default FilterSpec is always evaluated as True, and new FilterSpec's never get tested. It doesn't seem right to require a library file be modified in order to add a a feature to an application (for example, django-tagging which is what I was messing with when I found this.) Since I don't know exactly what channels I should be going through to submit this as a patch, I'll just put the solution I found here. It's easy to fix if you add the following the FilterSpec. {{{ #!python class FilterSpec(object): filter_specs = [] default = None #added ... def create(cls, f, request, params, model, model_admin): for test, factory in cls.filter_specs: if test(f): return factory(f, request, params, model, model_admin) ### added after this point if callable(default): return default(f, request, params, model, model_admin) create = classmethod(create) # new method def set_default(cls, factory): if callable(factory): cls.default = factory set_default = classmethod(set_default) }}} Then, just replace the last line (which registers AllValuesFilterSpec) with: {{{ #!python FilterSpec.set_default(AllValuesFilterSpec) }}} | nobody | elwaywitvac <elwaywitvac@gmail.com> | Filters | 0 | 1 | 0 | 0 | 0 | 0 |