SimpleListFilter 不执行任何操作 - 但其他任何 list_filter 也不执行任何操作

问题描述 投票:0回答:1

在 Django 5 admin 中应用

SimpleListFilter
时,无论值如何,我都会得到相同的查询集。经过一些测试,我意识到问题不仅在于 SimpleListFilter,还在于
list_filter
的所有字段。

class Monitor(models.Model):
    serial = models.CharField("serial", max_length=9, primary_key=True)
    status = models.PositiveSmallIntegerField("status", default=0)


class StatusFilter(admin.SimpleListFilter):
    title = "status"
    parameter_name = "status"

    def lookups(self, request, model_admin):
        return [(0, "off"), (1, "busy"), (2, "on")]
    
    def queryset(self, request, queryset):
        print("value:", self.value(), type(self.value()))
        if self.value() == 0:
            qs = queryset.filter(status=0)
            print("queryset count", qs.count())
            return qs
        elif self.value() == 1:
            qs = queryset.filter(status=1)
            print("queryset count", qs.count())
            return qs
        elif self.value() == 2:
            qs = queryset.filter(status=2)
            print("queryset count", qs.count())
            return qs
        print("no filter")
        return queryset

SimpleListFilter
的示例显示了正确的难度: 此屏幕截图中的数字是正确的(29,0,6) 当在过滤器上按一次(!)时,例如“打开”,我会返回多个打印结果,这比我预期的要多得多:

value: 2 <class 'str'>
no filter
value: 0 <class 'int'>
queryset count 29
value: 1 <class 'int'>
queryset count 0
value: 2 <class 'int'>
queryset count 6
value: 2 <class 'str'>
no filter
value: 2 <class 'str'>
no filter
value: 2 <class 'str'>
no filter

管理员看起来很正常,“搜索”功能也按预期工作并提供了正确的结果(我可以搜索

serial
并准确地得到一个请求和一个结果。

更多

ModelForm

class MonitorAdmin(admin.ModelAdmin):
    list_display = [...]
    readonly_fields = [...]
    list_display_links = [...]
    list_filter = [..., DisplayShelfStationFilter]
    search_fields = [...]
    ordering = [...]
 
    def has_add_permission(self, request, obj=None):
        return False    

    def get_urls(self):
        urls = super().get_urls()
        custom_urls = [...]
        return custom_urls + urls

    def change_view(self, request, object_id, extra_context=None):
        ...
        return super().change_view(request, object_id, extra_context=extra_context)
django django-admin
1个回答
0
投票

您需要与字符串进行比较:

class StatusFilter(admin.SimpleListFilter):
    title = "status"
    parameter_name = "status"

    def lookups(self, request, model_admin):
        return [('0', "off"), ('1', "busy"), ('2', "on")]
    
    def queryset(self, request, queryset):
        print("value:", self.value(), type(self.value()))
        if self.value() == '0':
            qs = queryset.filter(status=0)
            print("queryset count", qs.count())
            return qs
        elif self.value() == '1':
            qs = queryset.filter(status=1)
            print("queryset count", qs.count())
            return qs
        elif self.value() == '2':
            qs = queryset.filter(status=2)
            print("queryset count", qs.count())
            return qs
        print("no filter")
        return queryset
© www.soinside.com 2019 - 2024. All rights reserved.