django-tables2 CSS用于分组行

时间:2018-09-06 02:17:51

标签: django-tables2

使用django-tables2非常高兴。我现在正在尝试根据行内容找出如何更改行的CSS。例如,给定表:

header 1 | header 2
---------|---------
value 1  | 1
value 2  | 1
value 3  | 2
value 4  | 2
value 5  | 2
value 6  | 3
value 7  | 3

我希望能够使用相同的类为具有相同“标头2”值的连续行设置样式。借助itertools.groupby,可以很容易地对应该分组的值进行分组,但是我无法弄清楚如何遍历表对象并更新每一行的类attrs。

对于列,可以动态更新属性。例如,在 init 中,self.columns ['ColumnName']。column.attrs = {'td':{'class':'foo'}}有效。 但是,对于行,此(和各种排列)不起作用:

for i in self.rows:
    i.attrs = {'tr': {'class': 'foo'}}  # *** AttributeError, can't set attribute
    i.cells.row.attrs = {...}           # *** AttributeError
    i.cells.row.attrs['class'] = 'foo'  # Seems to work, but attrs not updated
    # same as above
    i.cells.row.attrs.update({'tr': {'class': 'foo'}})
    i.table.row_attrs = {'class': 'foo'} # works, but applies to the whole table at once.

很显然,我在这里的杆子末端错了。该文档建议在类Meta中使用row_attrs,它可以具有返回类值的函数。但是,在该函数中,一次只能看到一行(作为“记录”对象传递),而在这种情况下,则需要将表作为一个整体进行解析,因此 init 看起来像一个解决这个问题的更好的地方。

对于这种棘手情况或任何指针的解决方案将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果要访问前面的行,可以使用可调用对象,返回如下所示的可调用对象:

def group_by_heading():
    class_names = ["red", "blue", "yellow", ...]
    previous = None

    def inner(record):
        # in first row and after every change, remove the first element
        # and use it as the current class name.
        if previous is None or record.header_2 != previous.header_2:
            class_name = class_names.pop(0)

        previous = record
        return class_name
    return inner


class Table(tables.Table):
    class Meta:
        row_attrs = {'td': {'class': group_by_heading()}}

请注意,将函数group_by_heading添加到row_attrs字典时会被称为 。这称为closure

请注意,这不是一个完整的示例。如果按原样应用,则class_names列表将很快exhausted,因为每次呈现表时都会重新使用它。 您可以通过向视图中的表添加row_attrs来解决此问题。例如,使用SingleTableView

class MyView(tables.SingleTableView):
    table_class = MyTable
    queryset = Model.objects.all()

    def get_table_kwargs(self):
        return {"row_attrs": {'td': {'class': group_by_heading()}}}

这将确保在每个表视图中使用最新的class_name列表。

相关问题