Django-tables2 no ordena

Muestro una tabla de base de datos usando django-tables2. Todo parece estar bien, pero al hacer clic en los encabezados de las columnas no se ordena por esa columna. Se puede hacer clic en los encabezados, pero en su html no tiene texto de URL, por ejemplo:

<div class="table-container">
<table class="paleblue"><thead><tr><th class="id orderable sortable"><a href="">ID</a>
</th><th class="orderable sortable system"><a href="">System</a></th> ...

Revisé la fuente de la plantilla django-tables2 y dice esto:

... <a href="{% querystring table.prefixed_order_by_field=column.order_by_alias.next %}"> ...

Que no entiendo.

Solo puedo hacer que la clasificación funcione configurando order_by en view.py:

class ResultsTable(tables.Table):
    class Meta:
        model = Performance
        attrs = {'class': 'paleblue'}
        order_by_field = True

def result(request, system):
    results = Performance.objects.filter(system__name=system)
    table = ResultsTable(results, order_by=('<any column name from Performance>',))
    RequestConfig(request).configure(table)
    return render_to_response('result.html', {'table': table})

pero eso obviamente solo funciona para una columna y quiero hacer clic en las columnas para elegir por cuál ordenar.

Es mi entendimiento de la documentos que ordenar por columna debería funcionar 'fuera de la caja', ¿es correcto o estoy haciendo algo más mal?

preguntado el 12 de junio de 12 a las 08:06

order_by_field = True aquí no es válido. -

3 Respuestas

Experimenté el mismo problema, solo que me faltaba el

django.core.context_processors.request

de TEMPLATE_CONTEXT_PROCESSORS en settings.py

Respondido 15 Jul 12, 15:07

Gracias por la inclusión. Tenía el mismo problema. Esto me ayudó, junto con la respuesta aceptada. - Tomas Kremmel

Encontré la respuesta a mi propia pregunta, después de una noche de sueño y una nueva mirada y comparación palabra por palabra de mi código con los ejemplos en los documentos de django-tables2.

Para la función de resultado utilicé:

return render_to_response('result.html', {'table': table})

Si lo reemplazo por:

return render(request, 'result.html', {'table': table})

La clasificación funciona como se esperaba. No me preguntes por qué...

Respondido el 12 de junio de 12 a las 23:06

Gracias bradley. Django-tables2 es excelente por cierto, exactamente lo que necesitaba. - Juan Pedro

Bradley tiene razón. Para que tu primer ejemplo sea equivalente, escribirías return render_to_response('result.html', {'table': table}, RequestContext(request)) - Wilfredo Hughes

Otras respuestas en esta página apuntan en la dirección correcta, pero solo quería incluir todo lo necesario para que esto funcione en un solo lugar. En la vista:

  1. Defina su conjunto de consultas sin pedido
  2. Pase el conjunto de consultas a la instancia de la tabla
  3. Establezca cualquier personalización en la tabla obj, como el pedido predeterminado
  4. Envuélvelo todo en RequestConfig (esencial: ¡los pedidos no funcionarán sin esto!)
  5. Pase la tabla completamente configurada al contexto de la plantilla
# views.py
from django_tables2 import RequestConfig
...
data = MyModel.objects.all()
my_table = MySummariesTable(data)
my_table.order_by = "-name"
RequestConfig(request).configure(my_table)
ctx = {"my_table": my_table}

return render(request, "path/mytemplate.html", ctx)

Si alguna de sus columnas necesita ser ordenada por relaciones de clave externa, defínalas en las definiciones de columna de su tabla con, por ejemplo

col1 = tables.Column(verbose_name="Some Col", order_by="mycol.foobar.name")

Respondido el 03 de junio de 20 a las 01:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.