使用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 看起来像一个解决这个问题的更好的地方。
对于这种棘手情况或任何指针的解决方案将不胜感激。
答案 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列表。