Django-tables2-динамическое добавление столбцов в таблицу-не добавление attrs в тег таблицы в html

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

class ClientsTable(tables.Table):
    class Meta:
        model = Client
        attrs = {"class": "paleblue", "orderable":"True", "width":"100%"}
        fields = ('name',)

    def __init__(self, *args, **kwargs):
        super(ClientsTable, self).__init__(*args, **kwargs)
        self.counter = itertools.count()

    def render_row_number(self):
        return '%d' % next(self.counter)

    def render_id(self, value):
        return '%s' % value

и вот метод, который расширяет класс:

def define_table(roles):
    attrs = dict((r.name, tables.Column() for r in roles)
    klass = type('DynamicTable', (ClientsTable,), attrs)
    return klass

когда я создаю таблицу в views.py вот так:

table = define_table(roles)(queryset)

таблица показывает столбцы, как я хотел, но в html код я вижу, что он игнорировал attrs:

{"class": "paleblue", "orderable":"True", "width":"100%"}

таким образом, для paleblue нет стиля css, что важно для меня. Я чувствую, что это может быть что-то с мета-классом, но поля и модель работают, поэтому я понятия не имею, почему attrs не работают.

2 ответов


в первую очередь параметры meta не наследуются в django-tables2. Таким образом, вы можете проверить обходные пути, описанные в проблеме, чтобы увидеть, подходит ли что-то или вы можете вручную добавить мета-класс в динамическую таблицу. Для этого вы можете свой способ define_table такой:

def define_table(roles):
  attrs = dict((r.name, tables.Column() for r in roles)
  attrs['Meta'] = type('Meta', (), dict(attrs={"class":"paleblue", "orderable":"True", "width":"100%"}) )
  return klass

ой после более чем двух лет я заметил, что в моем коде была ошибка - Я забыл включить строку klass = type('DynamicTable', (ClientsTable,), attrs) до return klass выше. Я добавляю его сейчас для полнота.


для тех, кто ищет это сейчас, из django-tables2 1.10 вы добавляете столбцы динамически в таблицу, передавая extra_columns до Table конструктор.

extra_columns должен быть список кортежей, определяющее имя столбца и