Hay un corte simple de hacer esto, pero no es una solución general y requiere la modificación de todos los ModelAdmin
que desea apoyar esto. Tal vez haya una manera general de hacerlo, pero no he dedicado el tiempo para resolverlo en un nivel general.
El primer paso es escribir un FilterSpec
personalizado para el filtro (ver la publicación de Harley para enlaces que ayudarán) que guarda el valor del filtro elegido en la sesión (y lo borra cuando ya no lo desea).
# in cust_admin/filterspecs.py
from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec
class MyFilterSpec(ChoicesFilterSpec):
def __init__(self, f, request, params, model, model_admin):
super(MyFilterSpec, self).__init__(f, request, params, model,
model_admin)
if self.lookup_val is not None:
request.session[self.lookup_kwarg] = self.lookup_val
elif self.lookup_kwarg in request.session:
del(request.session[self.lookup_kwarg])
# Register the filter with a test function which will apply it to any field
# with a my_filter attribute equal to True
FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'my_filter', False),
MyFilterSpec))
Debe importar el módulo de esto está en algún lugar, por ejemplo, su urls.py
:
# in urls.py
from cust_admin import filterspecs
establecer una propiedad en el campo que desea aplicar el filtro:
# in models.py
class MyModel(models.Model):
my_field = Models.IntegerField(choices=MY_CHOICES)
my_field.my_filter = True
En una clase personalizada ModelAdmin
, anule el método change_view
, de modo que después de que el usuario haga clic en guarde, se devuelven a la vista de lista con su valor de campo de filtro agregado a la URL.
class MyModelAdmin(admin.ModelAdmin):
def change_view(self, request, object_id, extra_context=None):
result = super(MyModelAdmin, self).change_view(request, object_id,
extra_context)
if '_save' in request.POST:
if 'my_field__exact' in request.session:
result['Location'] = '/admin/myapp/mymodel/?my_field__exact=%s' \
% request.session['my_field__exact']
return result
Escribir un 'FilterSpec' no es suficiente. En realidad, es la vista la que controla el queryset, y eso toma sus parámetros de 'request.GET'. Todos los 'FilterSpec's realmente afectan a la visualización de las opciones de filtro. –
Además, redireccionar a una URL filtrada no es "realmente, realmente terrible". Las opciones de filtro deben ser explícitas en la URL. Sería mejor que tener una variable de sesión invisible afectando el conjunto de preguntas sin que esto sea evidente en la URL. –