我有一个包含许多列的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
,其属性显然无法改变。
有没有人知道这个问题的快速解决方法(“使所选列右对齐”)?
谢谢你, 菲利普
答案 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__
方法 - 绑定它们,并且模板中可以看到更改。