【问题标题】:django-tables2 css for grouped rows用于分组行的 django-tables2 css
【发布时间】:2018-09-06 02:17:50
【问题描述】:

使用 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,很容易对应该分组的值进行分组,但我不知道如何在表格对象中移动并更新每一行的类属性。

对于列,可以动态更新属性。例如,在 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 看起来像一个更好的地方来解决这个问题。

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

【问题讨论】:

  • 我仍然认为你应该使用row_attrs,带有一个可调用的。但是它需要保持一些状态,所以一个简单的 lambda 是行不通的。为什么需要“解析整个表格”?
  • @Jieter,非常感谢您的反馈。我可能不明白如何正确使用 row_attrs。我假设您的意思是在文档中指示的 Meta 类中。如果我将它与可调用对象一起使用,据我所知,我只能访问当前行的值,但是为了进行分组(我想用它来更改背景颜色),我需要一种知道当前行与前一行相比何时具有新值的方法,然后更改为不同的 css 类。它们有很多数据值,但我只想使用两种在数据值发生变化时会间歇性变化的 bg 颜色。

标签: django-tables2


【解决方案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_names 列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    相关资源
    最近更新 更多