在 Admin 中自定義 list_filter

weixin_34007291發表於2016-08-15

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裡即可使用了。

相關文章