Django-tables2 - 动态地向表添加列 - 不在html中向表标记添加attrs

时间:2013-05-22 15:40:43

标签: python django django-tables2

在我的Django项目中,我需要有表,哪些列是动态的,并且取决于数据库中的内容。所以我在here中找到了一个解决方案,它有效,但有一点问题。这是我正在动态扩展的表的类:

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风格,这对我很重要。 我觉得它可能是Meta类的东西但字段和模型正在工作,所以我不知道为什么没有attrs。

2 个答案:

答案 0 :(得分:7)

首先,django-tables2中的meta options are not inherited。因此,您可以检查问题中讨论的变通方法,看看是否适合,或者您可以手动将Meta类添加到动态表中。要做到这一点,你可以使用这样的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。我现在为了完整性而添加它。

答案 1 :(得分:6)

对于现在正在寻找此问题的人,从django-tables2 1.10开始,通过将extra_columns传递给Table构造函数,动态地将列添加到表中。

extra_columns应该是元组列表,定义列名和Column对象,例如。

class MyTable(Table):
    static_column = Column()

mytable = MyTable(extra_columns=[('dynamic_column', Column())]

请参阅以下网址上的API文档:http://django-tables2.readthedocs.io/en/latest/pages/api-reference.html#django_tables2.tables.Table