2010-02-16 28 views
20

Quiero tener columnas ordenables en mis tablas (al igual que lo que se hace para las listas de cambios de administrador) .... Estoy buscando una solución que será fácil de implementar y personalizar si quiero .Columnas de tablas ordenables en django

¿Cómo puedo hacer esto?

Respuesta

38

Si utiliza la paginación en lugar de una mesa clasificadora Javascript, se podría no ser suficiente o comportarse inesperadamente.


Cree cada encabezado de columna como un enlace, p.

<th><a href="?order_by=name">Name</a></th> 

y en la vista de comprobar si el parámetro order_by se establece o no:

order_by = request.GET.get('order_by', 'defaultOrderField') 
Model.objects.all().order_by(order_by) 
+0

Creo que el ";" al final de la línea de código 'order_by' es innecesario. No puedo editarlo porque la edición debe tener al menos 6 caracteres. –

+1

@ la_f0ka: Gracias ...Siempre estaba cambiando entre JavaScript y Python;) –

+0

np, gracias, ... No sabía cómo hacer esto y estaba a punto de instalar otra aplicación para manejarlo, cuando en realidad es tan simple. –

8

le sugiero que eche un vistazo a django-tables2. Está diseñado para resolver su problema exacto. El documentation tiene muchos ejemplos.

+1

Parece que Bradley movió su [fork] (https: // github .com/bradleyayers/django-tables2) y [docs] (http://django-tables2.readthedocs.org/). – davidfischer

+0

Gracias David, edité la mayoría de las publicaciones que pude encontrar para referirme al nuevo nombre, pero creo que me perdí este :( –

5

Utilicé el enfoque seguido de la respuesta más votada anteriormente. Pero resuelvo el orden ascendente/descendente al hacer clic varias veces en el encabezado de la columna usando una etiqueta personalizada.

La etiqueta:

from urllib.parse import urlencode 
from collections import OrderedDict 

@register.simple_tag 
def url_replace(request, field, value, direction=''): 
    dict_ = request.GET.copy() 

    if field == 'order_by' and field in dict_.keys():   
     if dict_[field].startswith('-') and dict_[field].lstrip('-') == value: 
     dict_[field] = value 
     elif dict_[field].lstrip('-') == value: 
     dict_[field] = "-" + value 
     else: 
     dict_[field] = direction + value 
    else: 
     dict_[field] = direction + value 

    return urlencode(OrderedDict(sorted(dict_.items()))) 

continuación, utiliza esta etiqueta en su encabezado de la columna, como la de arriba:

<th><a href="?{% url_replace request 'order_by' 'name' '-' %}">Name</a></th> 

La primera vez que se hace clic se clasificará en 'descendente' orden, si hace clic el mismo encabezado nuevamente volverá al orden 'ascendente'.

Este enfoque también conserva otros parámetros en su URL, como el número de página si está utilizando un paginador. No requiere bibliotecas adicionales. Lo único que debe asegurarse es que su vista envíe el RequestContext a la plantilla.

1

continua sobre la respuesta más votada por encima de Felix Kling y la adición de MPAF y ngeek, cuando se utilizan puntos de vista basados ​​clase: realizar la ordenación en el método get_queryset (auto), y uso:

<th><a href="?{% url_replace view.request 'order_by' 'name' '-' %}">Name</a></th> 

en lugar de simplemente solicitar en su plantilla

Cuestiones relacionadas