Aquí está mi solución genérica usando redireccionamiento, solo verifica si hay algún parámetro GET, si no existe ninguno, entonces redirige con el parámetro get predeterminado. También tengo un list_filter configurado, por lo que lo recoge y muestra el valor predeterminado.
from django.shortcuts import redirect
class MyModelAdmin(admin.ModelAdmin):
...
list_filter = ('status', )
def changelist_view(self, request, extra_context=None):
referrer = request.META.get('HTTP_REFERER', '')
get_param = "status__exact=5"
if len(request.GET) == 0 and '?' not in referrer:
return redirect("{url}?{get_parms}".format(url=request.path, get_parms=get_param))
return super(MyModelAdmin,self).changelist_view(request, extra_context=extra_context)
La única advertencia es cuando accedes directamente a la página con "?" presente en la URL, no hay HTTP_REFERER configurado, por lo que usará el parámetro predeterminado y redireccionará. Esto está bien para mí, funciona muy bien cuando haces clic en el filtro de administración.
ACTUALIZAR :
Para evitar la advertencia, terminé escribiendo una función de filtro personalizada que simplificó la funcionalidad changelist_view. Aquí está el filtro:
class MyModelStatusFilter(admin.SimpleListFilter):
title = _('Status')
parameter_name = 'status'
def lookups(self, request, model_admin): # Available Values / Status Codes etc..
return (
(8, _('All')),
(0, _('Incomplete')),
(5, _('Pending')),
(6, _('Selected')),
(7, _('Accepted')),
)
def choices(self, cl): # Overwrite this method to prevent the default "All"
from django.utils.encoding import force_text
for lookup, title in self.lookup_choices:
yield {
'selected': self.value() == force_text(lookup),
'query_string': cl.get_query_string({
self.parameter_name: lookup,
}, []),
'display': title,
}
def queryset(self, request, queryset): # Run the queryset based on your lookup values
if self.value() is None:
return queryset.filter(status=5)
elif int(self.value()) == 0:
return queryset.filter(status__lte=4)
elif int(self.value()) == 8:
return queryset.all()
elif int(self.value()) >= 5:
return queryset.filter(status=self.value())
return queryset.filter(status=5)
Y changelist_view ahora solo pasa el parámetro predeterminado si no hay ninguno presente. La idea era deshacerse de la capacidad de los filtros genéricos para ver todo sin usar parámetros de obtención. Para ver todo lo que asigné el estado = 8 para ese propósito:
class MyModelAdmin(admin.ModelAdmin):
...
list_filter = ('status', )
def changelist_view(self, request, extra_context=None):
if len(request.GET) == 0:
get_param = "status=5"
return redirect("{url}?{get_parms}".format(url=request.path, get_parms=get_param))
return super(MyModelAdmin, self).changelist_view(request, extra_context=extra_context)