0

所以我有我正在尝试做的和失败的简化版本。我有这个具有颜色字段的 Boxes 对象,并且可以通过 m2m 字段包含许多项目,所以我想要一个特定颜色框中所有项目的列表(一个查询集)。所以我为管理员制作了这个 django 过滤器。

from django.contrib.admin import SimpleListFilter
from store.models import Box

class Items(Model):
    name = CharField(max_length=200)

class Box(Model):
    items = ManyToManyField(Items)
    color_choices = (
        ('yellow','yellow'),
        ('green','green'),
    )
    box_color = CharField(max_length=200,choices=color_choices)

# So in my Items admin list i want to filter the items by color, this is my 'failed' attemp.

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.values():
            boxes = Box.objects.filter(items__in=queryset) # get only boxes with the current set of items
            boxes_ids = boxes.filter(box_color=self.values()).values_list('items__id',flat=True)
            return queryset.filter(id__in=boxes_ids)

我不确定出了什么问题,因为管理员向我展示了属于与我选择的颜色不同的盒子的物品。

4

1 回答 1

1

这是你的问题 :

  • 更改self.valuesself.value_if self.values():
  • 更改colorbox_color_boxes_ids = boxes.filter(color=self.values()) ...

代码示例(在 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)
于 2012-12-04T08:38:26.237 回答