Django-tables2: Manera intuitiva de agregar columnas dinámicamente

Creado en 17 abr. 2012  ·  3Comentarios  ·  Fuente: jieter/django-tables2

Debido a toda la metamagia que está ocurriendo, actualmente estoy usando:

class StatsTable(tables.Table):
   class Meta:
        orderable = False
        attrs = {'class': 'tablesorter'}

    def __init__(self, form, request, *args, **kwargs):
        rf_values = form.get_values()
        rf_annotations = form.get_annotations()
        rf_filter = form.get_filter()
        rf_calculations = form.get_calculations()                  
        data = list(
            HourlyStat.objects.filter(**rf_filter).values(*rf_values).annotate(**rf_annotations).order_by('-clicks')
        ) 
        super(StatsTable, self).__init__(data, *args, **kwargs)      
        columns = rf_values + rf_annotations.keys() + rf_calculations
        for col in columns:
            self.base_columns[col] = tables.Column()     

realmente el único problema conmigo al usarlo de esta manera es el hecho de que no puedo simplemente llamar a super() al final, tiene que estar en el medio. Supongo que es porque la metaclase en realidad no busca columnas base en sí misma, sino solo en modelos heredados. Realmente esto parece mucho más complicado que los campos self.fields en los formularios de django.

Comentario más útil

Esto es raro
Agrego columnas dinámicas simplemente agregándolas a self.base_columns:

self.base_columns['column_name'] = tables.Column()

Una cosa que encontré molesta es que al hacer eso, modifico el atributo de clase, no el atributo de instancia, por lo que cualquier columna que agregue en una solicitud, se mostrará en cada solicitud posterior a la tabla, la solución a las columnas dinámicas reales que encontré. era:

class ComponenteContableColumns(tables.Table):

    """Table that shows ComponentesContables as columns."""

    a_static_columns = tables.Column()

    def __init__(self, *args, **kwargs):
        # Create a copy of base_columns to restore at the end.
        self._bc = copy.deepcopy(self.base_columns)
        # Your dynamic columns added here:
        if today is 'monday':
            self.base_columns['monday'] = tables.Column()
        if today is 'tuesday':
            self.base_columns['tuesday'] = tables.Column()
        super().__init__(*args, **kwargs)
        # restore original base_column to avoid permanent columns.
        type(self).base_columns = self._bc

Todos 3 comentarios

Esto es raro
Agrego columnas dinámicas simplemente agregándolas a self.base_columns:

self.base_columns['column_name'] = tables.Column()

Una cosa que encontré molesta es que al hacer eso, modifico el atributo de clase, no el atributo de instancia, por lo que cualquier columna que agregue en una solicitud, se mostrará en cada solicitud posterior a la tabla, la solución a las columnas dinámicas reales que encontré. era:

class ComponenteContableColumns(tables.Table):

    """Table that shows ComponentesContables as columns."""

    a_static_columns = tables.Column()

    def __init__(self, *args, **kwargs):
        # Create a copy of base_columns to restore at the end.
        self._bc = copy.deepcopy(self.base_columns)
        # Your dynamic columns added here:
        if today is 'monday':
            self.base_columns['monday'] = tables.Column()
        if today is 'tuesday':
            self.base_columns['tuesday'] = tables.Column()
        super().__init__(*args, **kwargs)
        # restore original base_column to avoid permanent columns.
        type(self).base_columns = self._bc

Tengo el mismo problema que @jmfederico y he tenido que implementar su truco (solución alternativa) sugerido. ¿Hay alguna sugerencia mejor sobre cómo agregar dinámicamente columnas a una tabla? Tengo una tabla con fechas de una consulta en la parte superior, por lo que dependiendo de cómo se filtre, puede tener más o menos fechas y diferentes. No pude entender por qué a veces teníamos algunas columnas adicionales que no estaban en la consulta y descubrí que era el mismo problema.

Para referencia aquí está mi clase de tabla

class ActivitySummaryTable(TableWithRawData):
    activity = tables.Column(verbose_name=_('Activity'), orderable=False)
    # the rest of the columns will be added based on the filter provided

    def __init__(self, extra_cols, *args, **kwargs):
        """Pass in a list of tuples of extra columns to add in the format (colunm_name, column)"""
        # Temporary hack taken from: https://github.com/bradleyayers/django-tables2/issues/70 to avoid the issue where
        # we got the same columns from the previous instance added back
        # Create a copy of base_columns to restore at the end.
        _bc = copy.deepcopy(self.base_columns)
        for col_name, col in extra_cols:
            self.base_columns[col_name] = col
        super(ActivitySummaryTable, self).__init__(*args, **kwargs)
        # restore original base_column to avoid permanent columns.
        type(self).base_columns = _bc

    class Meta:
        attrs = {'class': 'table'}
        order_by = ('activity',)

Ejemplo donde filtramos las fechas y luego se agregan 2 fechas perdidas al final
image

arreglado en 817d711 usando el argumento extra_columns

¿Fue útil esta página
0 / 5 - 0 calificaciones