django-tables2: установить атрибуты для многих столбцов?

У меня есть таблица django-tables2 со многими столбцами. Следовательно, я не хочу указывать каждый столбец в классе Table отдельно, а просто задаю модель соответствующим образом.

Теперь я хотел бы изменить свойства некоторых столбцов, которые я могу идентифицировать по их имени. Я хотел бы сделать что-то вроде:

table = MyTable(my_queryset)

for col in table.columns.items():
    col_name = col[0]
    if col_name.endswith('some_suffix'):
        table.columns[col_name].attrs['td'].update({'align': 'right'})

... который должен был изменить все столбцы, имена которых заканчиваются на 'some_suffix', чтобы значения были выровнены правильно.

Проблема, однако, заключается в том, что table.columns[col_name] является BoundColumn, чьи свойства, по-видимому, не могут быть изменены.

Кто-нибудь знает быстрое решение этой проблемы («выровнять выбранные столбцы по правому краю»)?

Спасибо, Филипп.


person Phil    schedule 16.10.2015    source источник


Ответы (2)


Я обнаружил, что лучший способ сделать такие вещи - создать таблицу динамически (т.е. создать класс Table с использованием pythons type и установить его поля). Я описываю эту технику (для решения другой проблемы) в этой статье: http://spapas.github.io/2015/10/05/django-dynamic-tables-similar-models/

В этой статье я предлагаю создать метод get_table_class, который создаст подкласс Table. В вашем случае это может быть что-то вроде этого:

def get_table_class(model):
      def get_table_column(field):
          if field.name.endswith('some_suffix'):
              return tables.Column(attrs={"td": {"align": "right"}})
          else:
              return tables.Column()

      attrs = dict(
          (f.name, get_table_column(f)) for
          f in model._meta.fields if not f.name == 'id'
      )
      attrs['Meta'] = type('Meta', (), {'attrs':{"class":"table"}, "order_by": ("-created_on", ) } )
      klass = type('DTable', (tables.Table, ), attrs)

      return klass

Строка attrs = dict(...) выше создает словарь, содержащий все имена полей модели, которые вы передаете в нее (кроме поля id) в качестве ключей и соответствующих столбцов Table (используя проверку суффикса для их выравнивания через get_table_column) в качестве значений. Строка attrs['Meta'] = ... добавляет в этот словарь Meta (как вы можете видеть, атрибут модели больше не нужен), и, наконец, строка klass = type... создает подкласс Table, используя приведенный выше словарь!

person Serafeim    schedule 20.10.2015

У меня была аналогичная проблема: я не мог изменить атрибуты связанных столбцов. Этот вопрос кажется единственным в SO для решения этой проблемы.

Помимо table.columns есть еще свойство table.base_columns. Во втором столбцы еще не связаны. Итак, вот мой подход:

import django_tables2 as tables

class YourTable(tables.Table)
    # define your columns

    # overload the init method
    def __init__(self, *args, **kwargs):
        for col in self.base_columns:
            if col[0].endswith('some_suffix'):
                col[1].attrs['td'].update({'align': 'right'})
        # very important! call the parent method
        super(YourTable, self).__init__(*args, **kwargs)

Теперь изменения будут сохранены, потому что они внесены в базовые столбцы до их привязки. Вызов родительского метода — перегрузка метода __init__ — связывает их, и изменения видны в шаблоне.

person cezar    schedule 27.02.2018