Пользователь поставляет товары в некоторые страны бесплатно. Я хотел отфильтровать эти страны:
Все - все страны, Да - почтовые расходы отсутствуют, Нет - почтовые расходы оплачиваются.
Основной ответ на этот вопрос у меня не сработал (Django 1.3). Я думаю, потому что в методе __init__
не было предоставлено параметра field_path
. Также это подкласс DateFieldFilterSpec
. Поле postage
является FloatField
from django.contrib.admin.filterspecs import FilterSpec
class IsFreePostage(FilterSpec):
def __init__(self, f, request, params, model, model_admin, field_path=None):
super(IsFreePostage, self).__init__(f, request, params, model,
model_admin, field_path)
self.removes = {
'Yes': ['postage__gt'],
'No': ['postage__exact'],
'All': ['postage__exact', 'postage__gt'] }
self.links = (
('All', {}),
('Yes', {'postage__exact': 0}),
('No', {'postage__gt': 0}))
if request.GET.has_key('postage__exact'):
self.ttl = 'Yes'
elif request.GET.has_key('postage__gt'):
self.ttl = 'No'
else:
self.ttl = 'All'
def choices(self, cl):
for title, param_dict in self.links:
yield {'selected': title == self.ttl,
'query_string': cl.get_query_string(param_dict,
self.removes[title]),
'display': title}
def title(self):
return 'Free Postage'
FilterSpec.filter_specs.insert(0,
(lambda f: getattr(f, 'free_postage', False), IsFreePostage))
В self.links мы поставляем дикты. используется для построения строк HTTP-запроса, таких как ?postage__exact=0
для каждого из возможных фильтров. Фильтры Я думаю, являются кумулятивными, поэтому, если был предыдущий запрос «Нет», а теперь у нас есть запрос «Да», мы должны удалить
Запрос «Нет». self.removes
указывает, что нужно удалять для каждого запроса. Метод choices
создает строки запроса, сообщает, какой фильтр был выбран, и устанавливает отображаемое имя фильтра.