我在我的项目中使用django_tables2
库,并尝试实现一个表,其中每一行都具有一个data-item-name
属性。我的特定表继承自我的BaseTable
类,而该类又继承自django_tables2.Table
类。这是代码:
page_table.py
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')
# This method works perfectly fine as expected
def render_item_name(self, record):
return format_html(
'<span data-item-id="{0}">{1}</span>'.format(
record.item_id,
record.item_name
)
)
class Meta:
model = MyModel
# When debugging this attribute is accessed only on booting up
# And is ignored when I for example first visit or refresh the page
row_attrs={
'data-item-name': lambda r: r.item_name
}
fields = (
'item_id',
'item_name',
'item_description',
'item_price', # etc
)
base_table.py
from django_tables2 import Table
class BaseTable(Table):
def __init__(self, *args, **kwargs):
super(BaseTable, self).__init__(*args, **kwargs)
尽管呈现的表格没有错误并且没有任何破坏,但是在表格的单行上也没有data-item-name
属性,尽管就我阅读文档而言,据说声明了此属性在表的元类中就足够了。我是否误解了,或者我有什么想念的?任何帮助将不胜感激。
P.S。我正在使用Python 2.7,Django 1.8.17和django-tables2 v.1.16.0
答案 0 :(得分:3)
Django表也使用了metaclasses来分解表类,这就是您在调试器中看到的这样的行:仅在启动时被击中的原因,因为表的类正在创建。
另一方面,当您自定义行属性时,django-tables2(根据设计)的名称是该行中当前数据的名称record
。
您可以阅读docs:
默认情况下,为行提供类名奇数和偶数,可以使用row_attrs Table.Meta属性或作为Table的构造函数的参数对其进行自定义。只会添加类似字符串的值,将使用可选的关键字参数 record 调用可调用对象,并添加返回值。例如。