Как создать класс Tables2 динамически - PullRequest
0 голосов
/ 20 февраля 2020

В файле tables.py в примере dir есть:

class Bootstrap4Table(tables.Table):
    country = tables.Column(linkify=True)
    continent = tables.Column(accessor="country__continent", linkify=True)
    class Meta:
        model = Person
        template_name = "django_tables2/bootstrap4.html"
        attrs = {"class": "table table-hover"}
        exclude = ("friendly",)

Я пытаюсь создать класс таблицы динамически, поэтому я сделал: Переопределить метод get_table следующим образом:

def get_table(self, **kwargs):
    """
    Return a table object to use. The table has automatic support for
    sorting and pagination.
    """
    table_class, table_data = type('QueryTable', (tables.Table), myTableCol), mylist
    table_class = table_class
    print(table_class, table_data)
    table = table_class(data=table_data, **kwargs)
    return RequestConfig(self.request, paginate=self.get_table_pagination(table)).configure(table)

Где table_class, table_data - это место, где я создаю класс. myTableCol предоставляет столбцы, а mylist предоставляет данные для каждого столбца. Моя проблема в том, что я не знаю, как включить template_name = "django_tables2 / bootstrap4. html", когда я динамически создаю класс таблицы. Кроме того, когда я делаю это таким образом, в таблицах не отображаются какие-либо границы.

Я извлекаю данные из rdf-графика и не знаю ни имени, ни количества столбцов, поэтому хочу динамически создать столбцы вместе с Meta-классом с template_name = "django_tables2 / bootstrap4. html.

1 Ответ

0 голосов
/ 20 февраля 2020

Я понял это, просмотрев /django_tables2/tables.py.

Итак, я сначала создал Meta-класс, который будет служить внутренним классом для класса, который я хотел создать:

Meta = type('Meta', (object,), {'template_name':"django_tables2/bootstrap4.html", 'attrs':{"class": "paleblue"},})

Затем я добавляю этот класс в словарь myTableCol (мне нужно изменить имя), например myTableCol.update ({'Meta': Meta}).

Затем я создал класс, который Я хотел:

QueryTable2=type('QueryTable', (tables.Table,), myTableCol)

Причина, по которой мне пришлось обновить словарь имен столбцов, заключается в том, что строки 34-39 в /django_tables2/tables.py класса DeclarativeColumnsMetaclass зацикливаются на атрибутах класса и проверяет, являются ли элементы в myTableCol экземплярами столбца. Если true, ключ и значение добавляются в список словарей, если нет, то они добавляются в другой словарь в виде пар ключ / значение.

Итак, я обновил свою таблицу get_table следующим образом:

def get_table(self, **kwargs):
    """
    Return a table object to use. The table has automatic support for
    sorting and pagination.
    """
    ....
    other processing
    ....

    Meta = type('Meta', (object,), {'template_name':"django_tables2/bootstrap4.html", 'attrs':{"class": "paleblue"},})
    myTableCol.update({'Meta':Meta})
    QueryTable2=type('QueryTable', (tables.Table,), myTableCol)
    table_class, table_data =  QueryTable2, mylist
    table_class = table_class
    print(table_class, table_data)
    table = table_class(data=table_data, **kwargs)
    return RequestConfig(self.request, paginate=self.get_table_pagination(table)).configure(table)
...