django-tables2更新attrs无效

时间:2017-06-13 15:31:50

标签: python django python-3.x django-tables2

我正在使用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

2 个答案:

答案 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']