Django-tables2: Интуитивно понятный способ динамического добавления столбцов

Созданный на 17 апр. 2012  ·  3Комментарии  ·  Источник: jieter/django-tables2

Из-за всей происходящей мета-магии я сейчас использую:

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()     

на самом деле единственная проблема, связанная с тем, что я использую его таким образом, заключается в том, что я не могу просто вызвать super() последним, он должен быть посередине. Я предполагаю, что это потому, что метакласс на самом деле не ищет base_columns сам по себе, а только в унаследованных моделях. На самом деле это кажется более запутанным, чем self.fields в формах django.

Самый полезный комментарий

это странно
Я добавляю динамические столбцы, просто добавляя их в self.base_columns:

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

Одна вещь, которую я нашел раздражающей, заключается в том, что при этом я изменяю атрибут класса, а не атрибут экземпляра, поэтому любой столбец, который я добавляю по запросу, будет отображаться при каждом последующем запросе к таблице, решение реальных динамических столбцов, которое я нашел был:

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

Все 3 Комментарий

это странно
Я добавляю динамические столбцы, просто добавляя их в self.base_columns:

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

Одна вещь, которую я нашел раздражающей, заключается в том, что при этом я изменяю атрибут класса, а не атрибут экземпляра, поэтому любой столбец, который я добавляю по запросу, будет отображаться при каждом последующем запросе к таблице, решение реальных динамических столбцов, которое я нашел был:

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

У меня та же проблема, что и у @jmfederico, и

Для справки вот мой класс таблицы

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',)

Пример, когда мы фильтруем даты, а затем в конце добавляются 2 случайные даты
image

исправлено в 817d711 с использованием аргумента extra_columns

Была ли эта страница полезной?
0 / 5 - 0 рейтинги