function - Using custom methods with Django SimpleListFilter -
in essence, problem following set-up returning entire queryset in admin page regardless of filter for.
models.py
from django.db import models class booking(models.model): client = models.foreignkey(client) reference = models.charfield(max_length=100) .... def __unicode__(self): return self.reference class client(models.model): name = models.charfield(max_length=100) email = models.emailfield(null=true, blank=true) ... def __unicode__(self): return self.name def total_bookings(self): return len(self.booking_set.all()) def bookings0(self): if self.total_bookings() == 0: return true def bookings1(self): if self.total_bookings() == 1: return true def bookings2(self): if self.total_bookings() == 2: return true def bookings3plus(self): if self.total_bookings() > 2: return true ... admin.py
from django.contrib import admin django.contrib.admin import simplelistfilter django.utils.translation import ugettext_lazy _ clakes.models import client, booking ... class bookingadmin(admin.modeladmin): ... class numbookinglistfilter(simplelistfilter): title = _('number of bookings') parameter_name = 'numofbooks' def lookups(self, request, model_admin): return ( ('no', _('no bookings')), ('1', _('one')), ('2', _('two')), ('3plus', _('three or more')), ) def queryset(self, request, queryset): if self.value() == 'no': return [x x in queryset if x.bookings0()] if self.value() == '1': return [x x in queryset if x.bookings1()] if self.value() == '2': return [x x in queryset if x.bookings2()] if self.value() == '3plus': return [x x in queryset if x.bookings3plus()] class clientadmin(admin.modeladmin): list_display = ('name', 'email', 'total_bookings', ...) search_fields = ['name'] list_filter = (numbookinglistfilter,) ... ... admin.site.register(client, clientadmin) admin.site.register(booking, bookingadmin) can please explain me have gone wrong. filter appears on 'client' admin page expected, when 1 option selected filter not work - url changes http:.../client/?e=1 no filtering has occurred should. list comprehension works in shell - e.g. [x x in queryset if x.bookings1()] returns correct list of clients.
i happily consider different approach using managers, or whatever. whoever kind enough answer, please not point me @ documentation have spent hours reading , re-reading it, , if have missed point due lack of understanding rather effort.
so, there neater ways of going entire thing, following worked me:
admin.py
if self.value() == 'no': l = [x.id x in queryset if x.bookings0()] return queryset.filter(pk__in=l) if self.value() == '1': l = [x.id x in queryset if x.bookings1()] return queryset.filter(pk__in=l) ...etc... i hope helps @ point.
Comments
Post a Comment