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

Popular posts from this blog

assembly - 8086 TASM: Illegal Indexing Mode -

Java, LWJGL, OpenGL 1.1, decoding BufferedImage to Bytebuffer and binding to OpenGL across classes -

javascript - addthis share facebook and google+ url -