Django-tables2 no ordena
Frecuentes
Visto 3,062 veces
3
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?
3 Respuestas
5
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
1
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
1
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:
- Defina su conjunto de consultas sin pedido
- Pase el conjunto de consultas a la instancia de la tabla
- Establezca cualquier personalización en la tabla obj, como el pedido predeterminado
- Envuélvelo todo en
RequestConfig
(esencial: ¡los pedidos no funcionarán sin esto!) - 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 django django-tables2 or haz tu propia pregunta.
order_by_field = True
aquí no es válido. - bradley.ayers