django-tables2 especifica diferentes propiedades para diferentes filas

Me gustaría crear una tabla con django-tables2 para que diferentes filas tengan propiedades diferentes.

De forma predeterminada me sale bien

 

o

  

¿Cómo puedo especificar mi propia clase para algunas de las filas?

Del mismo modo, si tengo un CheckBoxColumn y especifico algunos datos para esta columna, entra en el valor :

  

Esto es genial para averiguar qué checkbox se marcó. Sin embargo, ¿cómo puedo configurar algunas casillas de verificación como marcadas cuando se crea la tabla?

Mi escenario: el usuario elige algunas filas de una tabla grande. Por ejemplo, la tabla tiene

  • naranja 1
  • naranja 2
  • manzana 5
  • naranja 3
  • manzana 4
  • pepino 7
  • aaple 1

El usuario escoge aple 5 y pepino 7 .

Luego me gustaría mostrar todas las manzanas y todos los pepinos, ya que el usuario escogió al menos una manzana y al menos un pepino. Esto permite al usuario ver otras entradas relevantes:

  • manzana 5
  • manzana 4
  • pepino 7

Sin embargo, me gustaría resaltar las entradas realmente seleccionadas por el usuario usando css y / o mostrando una checkbox marcada:

  • manzana 5
  • manzana 4
  • pepino 7

Bueno, déjame publicar mi propia solución.

He copiado la plantilla estándar table.html y la he editado. Solo cambié una línea:

  {% for row in table.page.object_list|default:table.rows %} {# support pagination #} {% block table.tbody.row %}   

en lugar de

   

De esta manera puede establecer una clase diferente para cada fila en la tabla. Queda por agregar una columna invisible a su clase de tabla:

 class MyTable(tables.Table): tr_class=tables.Column(visible=False) ... # other columns 

Después de eso, siempre que esté creando una tabla, puede establecer cualquier clase de CSS para cualquier fila en particular. Recuerda usar la plantilla modificada:

 {% render_table div_table "modifiedtable.html" %} 

Por supuesto, también puede cambiar el table.html original.

¿Alguien puede sugerir una solución más elegante?

En general, tengo la sensación de que a django_tables2 aún le faltan muchas características importantes, por lo que tengo que reinventar la rueda cada vez que bash hacer algo no trivial.

Definir tr_class

Para usar esto, debes usar renderizado personalizado . Por ejemplo:

 class MyTable(tables.Table): tr_class=tables.Column(visible=False, empty_values=()) def render_tr_class(self, value): if value.chosen == True: return 'highlight' 

Y al tr se le daría el highlight clase.

Tengo una solución muy fácil para esto

 class MyTable(tables.Table): source = tables.Column() def render_source(self, value): if value == 'some_value': return mark_safe("%s" % (escape(value))) else: return value 

Luego, en lugar de crear una página HTML personalizada completa para la representación personalizada, puede usar jQuery para resaltar la fila.

 $('.highlight_this_row').parent().parent().addClass('highlight'); 

Si no tiene un “resaltado” de clase definido, puede definirlo como:

  

Hay otra forma (tampoco muy hermosa), pero aquí no tiene que definir una columna falsa.

Primero, extiendes django_tables2.rows.BoundRows :

 class ColoredBoundRows(BoundRows): def __iter__(self): for record in self.data: row = BoundRow(record, table=self.table) row.style = 'some_class' yield row def __getitem__(self, key): container = ColoredBoundRows if isinstance(key, slice) else BoundRow return container(self.data[key], table=self.table) 

Entonces haz que tu mesa lo use:

 class YourTable(Table): def __init__(self, *args, **kwargs): super(YourTable, self).__init__(*args, **kwargs) self.rows = ColoredBoundRows(data=self.data, table=self) 

Luego defina una nueva plantilla (tenga en cuenta que solo tiene que sobrescribir un bloque):

 {% extends "django_tables2/table.html" %} {% block table.tbody.row %}  {% for column, cell in row.items %} {{ cell }} {% endfor %}  {% endblock table.tbody.row %} 

Realmente no pude conseguir que la respuesta aceptada funcionara para esto, tal vez la última versión de django_tables2 es diferente. Aquí está mi solución, que no requiere modificar la plantilla tables.html y se basa en la documentación .

Primero define row_attrs como parte de la clase Meta

 class MyTable(tables.Table): my_column = tables.Column() class Meta: row_attrs = {'class': my_custom_row_attrs} 

Luego, puede definir una función fuera del scope de MyTable para elaborar sus atributos de fila en función de los valores en el record fila individual

 def my_custom_row_attrs(**kwargs): '''My function to generate custom row attributes ''' record = kwargs.get('record', None) tr_class = '' if record: # Only do comparison if pat_date is present if record.my_column.value == True: tr_class = 'highlight' return tr_class 

Preferiría mantener toda esta funcionalidad dentro de la clase, pero esta parecía la mejor manera de hacerlo para evitar modificar cualquier otra cosa.