django - 将自定义方法与 Django SimpleListFilter 一起使用

标签 django function django-models filter admin

本质上,我的问题是,无论我过滤什么内容,以下设置都会返回管理页面中的整个查询集。

模型.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)

有人可以向我解释一下我哪里出了问题吗?过滤器按预期显示在“客户端”管理页面上,但是当选择一个选项时,过滤器不起作用 - url 更改为 http:.../client/?e=1 但没有发生应有的过滤。我的列表理解在 shell 中有效 - 例如[x for x in queryset if x.bookings1()] 返回正确的客户列表。

我很乐意考虑使用经理等不同的方法。无论谁愿意回答,请不要只指出我的文档,因为我现在已经花了几个小时阅读并重新阅读它,所以如果我错过了这一点,那是由于缺乏理解而不是努力。

最佳答案

所以,可能有更简洁的方法来处理整个事情,但以下方法对我有用:

admin.py

if self.value() == 'no':
        l = [x.id for x in queryset if x.bookings0()]
        return queryset.filter(pk__in=l)
if self.value() == '1':
        l = [x.id for x in queryset if x.bookings1()]
        return queryset.filter(pk__in=l)
...etc...

我希望这可以在某个时候帮助某人。

关于django - 将自定义方法与 Django SimpleListFilter 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18271443/

相关文章:

django - Google App Engine Standard 找不到/执行 Gunicorn

python - 如何处理 Python Social Auth 上的异常

django - 配置不当 : Error loading psycopg2 module: No module named cffi

c - 如何将一个数组的变量值赋给另一个变量?

Django order_by() 过滤器与 distinct()

django - 在 Django 中,当登录用户提交表单时,如何自动将用户名添加到模型中

python - django模型字段中字符串参数的含义是什么?

python - 错误消息在 Django 中未按预期工作

c++ - 具有模板类的函数模板特化

r - 对数似然的优化,传入不同的数据集