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.
tablesorter es un conjunto de herramientas excelente y compatible. El enlace de arriba es antiguo; asegúrese de consultar https://github.com/Mottie/tablesorter – staggart