1👍
This is your problem :
- change
self.values
toself.value
inif self.values():
- change
color
tobox_color
inboxes_ids = boxes.filter(color=self.values()) ...
Code Example (Test and work on django 1.4.2)
from box.models import Items,Box
from django.contrib import admin
from django.utils.translation import ugettext_lazy as _
from django.contrib.admin import SimpleListFilter
class Items_by_payment_system_filter(SimpleListFilter):
title = _('Colors')
# Parameter for the filter that will be used in the URL query.
parameter_name = 'color'
def lookups(self, request, model_admin):
"""
Returns a list of tuples. The first element in each
tuple is the coded value for the option that will
appear in the URL query. The second element is the
human-readable name for the option that will appear
in the right sidebar.
"""
return Box.color_choices
def queryset(self, request, queryset):
# Remember that self.value contains the current selection in the filter options displayed to the user in Admin
if self.value():
boxes = Box.objects.filter(items__in=queryset) # get only boxes with the current set of items
boxes_ids = boxes.filter(box_color=self.value()).values_list('items__id',flat=True)
return queryset.filter(id__in=boxes_ids)
class ItemsAdmin(admin.ModelAdmin):
fields = ['name']
list_filter = (Items_by_payment_system_filter,)
admin.site.register(Items,ItemsAdmin)
admin.site.register(Box)
Source:stackexchange.com