如何在django-tables2的类定义中根据记录值通过条件语句设置表格行格式
解决django-tables2根据记录值设置行样式的问题
你的问题在于在Meta类里直接编写条件判断的时机不对——Meta类是在定义OrderTable类的时候执行的,这时候还没有具体的订单记录实例,所以你写的lambda或者自定义函数根本拿不到当前行的record数据。下面给你两种正确的实现方式:
方法一:用Lambda表达式直接写条件判断
这是最简洁的方式,直接在row_attrs的class值里用lambda根据record的status返回对应的样式类:
class OrderTable(tables.Table): my_id = tables.Column(verbose_name="Order number") status = tables.Column(verbose_name="Order status") class Meta: model = Order row_attrs = { "class": lambda record: "table-success" if record.status == '0' else "" }
当django-tables2渲染每一行时,会自动把当前行的record传入这个lambda函数,根据status的值返回对应的CSS类。
方法二:自定义函数处理复杂逻辑
如果你的判断逻辑比较复杂(比如多个status值对应不同样式),可以把逻辑抽成一个单独的方法,放在OrderTable类中:
class OrderTable(tables.Table): my_id = tables.Column(verbose_name="Order number") status = tables.Column(verbose_name="Order status") def get_row_css_class(self, record): # 这里可以写更复杂的判断逻辑 if record.status == '0': return "table-success" elif record.status == '1': return "table-warning" elif record.status == '2': return "table-danger" else: return "" class Meta: model = Order row_attrs = { "class": lambda record: record.table.get_row_css_class(record) }
这里的record.table会指向当前的OrderTable实例,通过它调用我们定义的get_row_css_class方法,传入当前行的record就能得到对应的样式类。
为什么你的之前的写法不对?
- 你在
Meta类里直接写if lambda record: record.status = '0':这时候是类定义阶段,lambda只是一个函数对象,不是具体的status值,所以这个比较完全不成立,而且赋值符号=也写错了,应该是==。 - 在
Meta里定义check_status函数并直接调用:同样是类定义阶段,没有可用的record实例,根本无法传入参数,这种写法只会在类加载时执行一次,而不是每行渲染时执行。
内容的提问来源于stack exchange,提问作者Jorhanc
相关产品推荐
相关产品推荐

