2008-10-07 16 views
5

Lo que me gustaría achive es:filtros teniendo en Django administración

  • voy al sitio de administración, aplicar algunos filtros a la lista de objetos
  • que haga clic y edición de objetos, editar, editar, golpeó 'Guardar'
  • El sitio me lleva a la lista de objetos ... sin filtro. Me gustaría tener el filtro del paso 1 recordado y aplicado.

¿Hay una manera fácil de hacerlo?

Respuesta

3

Lamentablemente, no hay una manera fácil de hacerlo. El filtrado no parece guardarse en ninguna variable de sesión.

clic en Atrás dos veces es el método normal, pero puede ser unweildy y molesto si ha acaba de cambiar un objeto por lo que ya no debe demostrar usando el filtro.

Si se trata de una sola vez, haga clic dos veces o vuelva a filtrar, es la manera más fácil.

Si va a filtrar con más frecuencia, o si simplemente quiere aprender a piratear el administrador (que es bastante abierto y fácil), querrá escribir un FilterSpec.

Tener una mirada here y here de ejemplos de personas que escriben su propia cuenta.

Un muy, muy horrible manera de hacer esto sería la de modificar la interfaz de administración para que después de hacer clic en "Guardar", se le redirige a la URL que se filtra. No recomendaría esto en absoluto, pero es una opción.

Otra forma bastante simple de hacer esto sería escribir una visión genérica para mostrar sus objetos filtrados, a continuación, utilizar formas de Django para editar los artículos de allí. Echaré un vistazo a esto, te sorprenderá lo poco que tienes que escribir para obtener una página de vista/edición simple.

+1

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. –

+0

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. –

1

Haga clic 2 veces "Atrás"?

+0

KISS en su mejor momento :) –

1

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 
+0

¿Esto significa que cada vez que vea la página de administración del modelo, se filtrará? ¿O simplemente recuerda el filtro que ha aplicado para una sesión? –

0

Otra forma de hacerlo es insertar el filtro en el conjunto de preguntas.

Puede crear dinámicamente un modelo de proxy con un administrador que filtre de la manera que desee, luego llame a admin.site.register() para crear un administrador de modelo nuevo. Todos los enlaces serían relativos a esta vista.

0

En mi opinión, es mejor reemplazar los métodos de ModelAdmin changelist_view y change_view:

así:

class FakturaAdmin(admin.ModelAdmin): 

[...] 

def changelist_view(self, request, extra_context=None): 
    result = super(FakturaAdmin, self).changelist_view(request, extra_context=None) 
    request.session['qdict'] = request.GET 
    return result 

def change_view(self, request, object_id, extra_context=None): 
    result = super(FakturaAdmin, self).change_view(request, object_id, extra_context) 
    try: 
     result['location'] = result['location']+"?"+request.session['qdict'].urlencode() 
    except: 
     pass 
    return result 

Como quiera, después de guardar el objeto que volver a la lista de objetos con filtros activos.

0

Hay una solicitud de cambio en el proyecto Django que solicita exactamente esta funcionalidad.

Todo lo que está esperando para su verificación es algunas pruebas y documentación. Podría escribirlos y ayudar con todo el proyecto, o simplemente podría tomar el parche propuesto (cerca de la parte inferior de la página) y probarlo.

https://code.djangoproject.com/ticket/6903

0

Esta característica se ha agregado a Django como parte de la versión 1.6 y ahora está activado por defecto. Se describe en la release notes:

ModelAdmin ahora conserva filtros en la vista de lista después de crear, de editar o borrar un objeto. Es posible restablecer el comportamiento anterior de de los filtros de compensación estableciendo el atributo preserve_filters en False.

Cuestiones relacionadas