django-tables2:为很多列设置attrs?

时间:2015-10-16 13:56:32

标签: python css django django-tables2

我有一个包含许多列的django-tables2表。因此,我不想单独指定Table类中的每一列,而只是相应地设置Model。

现在,我想更改一些我可以通过名称识别的列的属性。我想做点什么:

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,其属性显然无法改变。

有没有人知道这个问题的快速解决方法(“使所选列右对齐”)?

谢谢你, 菲利普

2 个答案:

答案 0 :(得分:0)

我发现执行此类操作的最佳方法是动态创建表(即使用pythons Table创建type类并设置其字段)。我在本文中描述了这种技术(以解决不同的问题):http://spapas.github.io/2015/10/05/django-dynamic-tables-similar-models/

我在该文章中提出的建议是创建一个将创建Table子类的get_table_class方法。在你的情况下,它可能是这样的:

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子类词典!

答案 1 :(得分:0)

我遇到了类似的问题,无法更改绑定列的属性。这个问题似乎是解决这个问题的唯一问题。

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__方法 - 绑定它们,并且模板中可以看到更改。