本質的に、私の問題は、次のセットアップが、何をフィルタリングするかに関係なく、管理ページにクエリセット全体を返すことです。
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
from django.contrib.admin import SimpleListFilter
from django.utils.translation import ugettext_lazy as _
from 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 for x in queryset if x.bookings0()]
if self.value() == '1':
return [x for x in queryset if x.bookings1()]
if self.value() == '2':
return [x for x in queryset if x.bookings2()]
if self.value() == '3plus':
return [x for 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)
誰かが私がどこで間違っているのか説明してもらえますか. フィルターは期待どおり「クライアント」管理ページに表示されますが、1 つのオプションを選択するとフィルターが機能しません。URL は http:.../client/?e=1 に変わりますが、本来のフィルタリングは行われません。私のリスト内包表記はシェルで機能します。たとえば、[x for x in queryset if x.bookings1()] はクライアントの正しいリストを返します。
マネージャーなどを使用した別のアプローチを喜んで検討します。親切に答えてくれる人は誰でも、私がドキュメントを何時間もかけて読んだり読み直したりしているので、私にドキュメントを指摘しないでください.