我正在使用django + django-tables2。我想在我的表的每一列中添加一个包含其名称的td级属性(供以后的客户端处理)。表格基于模型,并且不是逐列构建的。因此,在我定义表格时,我没有机会提供这些属性。
我正在尝试使用这段代码在稍后阶段注入属性:
def inject_data_names(table: tables.Table) -> tables.Table:
for col_name, col in table.columns.items():
col.attrs['td']['data'] = str(col_name)
print(col.attrs)
return table
但是,当在table的子实例上运行时,似乎没有任何效果。表。 print语句显示了这一点:
{'class': 'paleblue table', 'th': {'class': 'id orderable'}, 'td': {'class': 'id'}}
{'class': 'paleblue table', 'th': {'class': 'description orderable'}, 'td': {'class': 'description'}}
{'class': 'paleblue table', 'th': {'class': 'orderable start'}, 'td': {'class': 'start'}}
正如您所看到的,"数据"价值似乎缺失。使用Python 3.6.1,最新的Django和django-tables2。有线索吗?
UPD:查看源代码,BoundColumn中的方法attrs实际返回字典的副本,因此更新无效。问题是,做出我想要的改变的正确方法是什么?
链接:http://django-tables2.readthedocs.io/en/latest/_modules/django_tables2/columns/base.html#BoundColumn
答案 0 :(得分:1)
感谢图书馆的开发人员,现在我的问题已经解决了。它需要包的版本1.9.0或更高版本:
class Table(tables.Table):
class Meta:
attrs = {
'td': {'data-name': lambda column: column.name}
}
关于github的进一步讨论:https://github.com/bradleyayers/django-tables2/issues/451
答案 1 :(得分:0)
我对django-tables不太熟悉,但我发现有人最近将这个功能添加到了库中:
https://github.com/bradleyayers/django-tables2/issues/70
这是提交的测试用例,它添加了动态添加列的功能:github link
# coding: utf-8
from __future__ import absolute_import, unicode_literals
import django_tables2 as tables
def test_dynamically_adding_columns():
'''
When adding columns to self.base_columns, they are actually added to
the class attribute `Table.base_columns`, and not to the instance
attribute, `table.base_columns`
issue #403
'''
data = [
{'name': 'Adrian', 'country': 'Australia'},
{'name': 'Adrian', 'country': 'Brazil'},
{'name': 'Audrey', 'country': 'Chile'},
{'name': 'Bassie', 'country': 'Belgium'},
]
class MyTable(tables.Table):
name = tables.Column()
# this is obvious:
assert list(MyTable(data).columns.columns.keys()) == ['name']
assert list(MyTable(data, extra_columns=[
('country', tables.Column())
]).columns.columns.keys()) == ['name', 'country']
# this new instance should not have the extra columns added to the first instance.
assert list(MyTable(data).columns.columns.keys()) == ['name']