Primeiro passo é importar
from django.contrib.admin import SimpleListFilter
Segundo passo criar a classe customizada
class MenusRelacionadosFilter(SimpleListFilter):
parameter_name = u'menu'
title = u'todos relacionados Menu'
# aqui você faz a listagem das opções do filtro
def lookups(self, request, model_admin):
return tuple((unicode(menu.slug), menu.nome)
for menu in Menu.objects.filter(secao_pai=None))
def queryset(self, request, queryset):
# se não tiver parametros mostrará todos os dados
if not self.value():
return Menu.objects.all()
# se passar parametro faz o filtro
return Menu.objects.filter(
Q(slug=self.value()) | Q(menu__slug=self.value)
).distinct()
Para finalizar precisa adicionar ao list_filter
class MenuAdmin(AdminImageMixin,admin.ModelAdmin):
list_filter = [MenusRelacionadosFilter, ]
Código completo de um exemplo
# -*- coding: utf-8 -*-
from django.contrib import admin
from django.db.models import Q
from django.contrib.admin import SimpleListFilter
from models import *
from sorl.thumbnail.admin import AdminImageMixin
class MenusRelacionadosFilter(SimpleListFilter):
parameter_name = u'menu'
title = u'todos relacionados Menu'
def lookups(self, request, model_admin):
return tuple((unicode(menu.slug), menu.nome)
for menu in Menu.objects.filter(secao_pai=None))
def queryset(self, request, queryset):
if not self.value():
return Menu.objects.all()
return Menu.objects.filter(
Q(slug=self.value()) | Q(menu__slug=self.value)
).distinct()
class MenuAdmin(AdminImageMixin,admin.ModelAdmin):
list_display = ('nome', 'corAdmin', 'template', 'icone_menuAdmin', 'icone_paginaAdmin', 'ativo')
search_fields = ('nome',)
list_filter = [MenusRelacionadosFilter, 'ativo', 'template', ]
save_on_top = True
list_per_page = 20
prepopulated_fields = {"slug": ("nome",)}
admin.site.register(Menu,MenuAdmin)
AVISO DE SEGURANÇA (DYOR): Todo o conteúdo do wiskton.xyz tem caráter estritamente educativo e informativo. Criptoativos envolvem volatilidade e riscos cibernéticos. Jamais compartilhe sua seed phrase ou chaves privadas com terceiros.