django_tables2 Table Meta的row属性未显示问题求助
我碰到过类似的情况,在你使用的Django 1.8.17和django-tables2 v1.16.0这个版本组合里,确实存在Meta.row_attrs在继承自定义父表时不生效的问题,尤其是用lambda表达式的时候。
问题原因分析
你提到row_attrs里的lambda只在项目启动时被访问,页面刷新时没触发——这是因为旧版本的django-tables2在处理类Meta中的lambda属性时,没有在每行渲染时动态调用它,而是在类加载阶段就执行了,自然无法获取到每个record的实际数据。另外,自定义BaseTable的继承关系也可能导致父类初始化逻辑没有正确传递子类的row_attrs配置。
解决方案:改用get_row_attrs方法
在django-tables2的早期版本中,更可靠的设置行属性的方式是重写get_row_attrs方法,它会在每行渲染时被主动调用,确保能拿到当前行的record对象。
修改你的PageTable代码如下:
import django_tables2 as tables from django.utils.html import format_html from myapp.utils.base_table import BaseTable from myapp.models import MyModel class PageTable(BaseTable): item_id = tables.Column(accessor='pk') def render_item_name(self, record): return format_html( '<span data-item-id="{0}">{1}</span>'.format( record.item_id, record.item_name ) ) # 新增这个方法来设置行属性 def get_row_attrs(self, record): return { 'data-item-name': record.item_name } class Meta: model = MyModel # 移除原来的row_attrs配置 fields = ( 'item_id', 'item_name', 'item_description', 'item_price', # 其他字段 )
为什么这样可行?
get_row_attrs是django-tables2提供的钩子方法,每次渲染一行时都会调用它,并传入当前行对应的record实例。这样你就能动态获取每个item的name,准确设置到行的data-item-name属性上,完全避免了原来lambda表达式的时机问题。
另外,你的BaseTable的__init__方法只是简单调用了父类的初始化,不会干扰这个方法的执行,所以不用修改base_table.py的代码。
测试一下,刷新页面后应该就能看到每行都带有正确的data-item-name属性了。
内容的提问来源于stack exchange,提问作者AlexNikolaev94

