@ Джох Демпси указал, что, возможно, вам не нужен специальный FilterSpec только для полей m2m.
Однако сегодня я обнаружил, что хочу один для поля тега django-taggit . Тэги в основном являются отношением m2m, но он жалуется на 'TaggableManager' object has no attribute 'get_choices'
, если вы попытаетесь добавить поле тега в list_filter.
В данном случае это был код @ lazerscience на помощь ...
Однако это не сработало при использовании против Django 1.3, потребовалось добавить пару новых строк, сравните мою версию ниже, которая работает:
class TagFilterSpec(RelatedFilterSpec):
def __init__(self, f, request, params, model, model_admin, field_path=None):
super(RelatedFilterSpec, self).__init__(
f, request, params, model, model_admin, field_path=field_path)
self.lookup_title = f.verbose_name # use field name
self.lookup_kwarg = f.name
self.lookup_kwarg_isnull = '%s__isnull' % (self.field_path)
self._lookup_model = f.rel.to
self.lookup_val = request.GET.get(self.lookup_kwarg, None)
self.lookup_val_isnull = request.GET.get(
self.lookup_kwarg_isnull, None)
self.user = request.user
self.lookup_choices = [(g.pk, g.name) for g in Tag.objects.all()]
def has_output(self):
return len(self.lookup_choices) > 1
def title(self):
return self._lookup_model._meta.verbose_name
FilterSpec.filter_specs.insert(0,
(lambda f: f.rel.to == Tag, TagFilterSpec))