在 Admin 中自定义 list_filter

list_filter可以对数据进行筛选,支持 BooleanField、CharField、DateField、DateTimeField、IntegerField、ForeignKey或ManyToManyField。另外,还可以自定义!

假设这里有一个Task模型并为其增加一个自定义过滤器使其能够方便的筛选出“未完成的任务”、“完成的任务”,我们可以这样做:

# -*- coding:utf-8 -*-

from django.contrib import admin
from django.contrib.admin import SimpleListFilter
from .models import Task


class TaskCompletedFilter(SimpleListFilter):
    title = '是否完成'
    parameter_name = 'completed'

    def lookups(self, request, model_admin):
        # 第一个对应查询参数的值,第二个对应下拉列表选项
        return (
            ('0', '未完成'),
            ('1', '完成'),
        )

    def queryset(self, request, queryset):
        if self.value() == '0':
            return Task.objects.filter(completed='0').all()
        elif self.value() == '1':
            return Task.objects.filter(completed='1').all()


class TaskAdmin(admin.ModelAdmin):
    list_display = ('title', 'description', 'completed', 'create_date')
    search_fields = ('title',)
    list_filter = (TaskCompletedFilter,)
    ordering = ('-create_date',)


admin.site.register(Task, TaskAdmin)

TaskCompletedFilter继承自 django.contrib.admin.SimpleListFilter,并提供titleparameter_name属性分别对应过滤器的名称和查询关键字名。另外,还需重写lookupsqueryset两个方法,分别对应查询选项和数据筛选。

最后,将其添加到TaskAdminlist_filter里即可使用了。

你可能感兴趣的:(在 Admin 中自定义 list_filter)