2015-10-16 3 views
1

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

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

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, свойства которого, по-видимому, не могут быть изменены.

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

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

ответ

0

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

0

У меня была аналогичная проблема, не будучи в состоянии изменить атрибуты связанных столбцов. Этот вопрос, кажется, единственный в 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_colulmns: 
      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__ - связывает их, и изменения видны в шаблоне.