如何在 django-tables2 中添加计数器列?
How to add counter column in django-tables2?
我正在尝试使用 django-tables2 在 table 的第一列添加一个计数器,但下面的解决方案仅在 # 列下显示所有 0。我应该如何添加一列,其中有一列对行进行编号?
tables.py:
import django_tables2 as tables
from profiles.models import Track
import itertools
counter = itertools.count()
class PlaylistTable(tables.Table):
priority = tables.Column(verbose_name="#", default=next(counter))
class Meta:
model = Track
attrs = {"class": "paleblue"}
orderable = False
fields = ('priority', 'artist', 'title')
我的模板:
{% render_table table %}
来自 Column
的文档
default (str or callable)
:
The default value for the column. This can be a value or a callable object [1]
. If an object in the data provides None
for a column, the default will be used instead.
[1] - The provided callable object must not expect to receive any arguments.
你传递的是什么next(counter)
你传递的是一个似乎是整数的函数的结果。
您可以定义一个函数:
def next_count():
return next(counter)
并且,将其用作默认值:
priority = tables.Column(verbose_name="#", default=next_count)
或者,您可以使用 @Sayse 评论中提到的 lambda 函数:
priority = tables.Column(verbose_name="#", default=lambda: next(counter))
其他答案在 tables.py
文件的顶层范围内都有 itertools.count
实例。这使得计数器在页面加载之间持续存在,它只会在服务器重新启动时重置。更好的解决方案是像这样在 table 上添加计数器作为实例变量:
import django_tables2 as tables
import itertools
class CountryTable(tables.Table):
counter = tables.Column(empty_values=(), orderable=False)
def render_counter(self):
self.row_counter = getattr(self, 'row_counter', itertools.count())
return next(self.row_counter)
这将确保每次实例化 table 时都会重置计数器。
基于 Jieter 的回答,您可以通过以下小修改来处理分页:
import django_tables2 as tables
import itertools
class CountryTable(tables.Table):
counter = tables.Column(empty_values=(), orderable=False)
def render_counter(self):
self.row_counter = getattr(self, 'row_counter',
itertools.count(self.page.start_index()))
return next(self.row_counter)
即使在第一页之后的页面中,行编号也是全局正确的。请注意,在这种情况下索引是基于 1 的。
添加到杰特的回答中,
在你的 table class 中,实现这些功能。
init 方法用于从视图 class 获取请求变量以获取页码。
将 render_id 更改为 render_yourcolumn 名称。
class ClassName:
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super(ClassName, self).__init__(*args, **kwargs)
def render_id(self):
page = int(self.request.GET.get('page', 1)) - 1
self.row_counter = getattr(self, 'row_counter', itertools.count(start=page*25+1)) # Change 25 to the number of rows in one page
return next(self.row_counter)
现在在视图文件中,将您的 Table class 命名为:
table = ClassName(ModelName.objects.values(), request=request)
通过这种方法,您的计数器将正确显示 n 页数。 :)
有类似的问题,但没有找到任何简单的解决方案可以在分页表上工作,而无需在每页上重置计数器
来自官方FAQ:How to create a row counter?(不支持分页)
使用已有的分页器属性:
(类似一般的 django 方法)
import django_tables2 as tables
class NumberedTable(tables.Table):
serial_column = tables.TemplateColumn(
verbose_name='#',
"{{ row_counter|add:table.page.start_index }}",
)
...
这是一个不专业的方法,没有使用 itertools 模块:
import django_tables2 as table
class GenericTable(table.Table):
"""GenericTable
"""
counter = table.Column(
verbose_name='#',
orderable=False,
accessor='pk',
)
def render_counter(self, record):
"""render_counter
:param record: record
:return: custom render
"""
records = list(self.data)
index = records.index(record)
# counter = index # counter starts from 0
counter = index + 1 # counter starts from 1
return counter
来自Jieter 回答
如果不想让每一页都从零开始,您可以这样做:
import django_tables2 as tables
import itertools
class CountryTable(tables.Table):
counter = tables.Column(empty_values=(), orderable=False)
def render_counter(self):
self.row_counter = getattr(self, 'row_counter', itertools.count())
return next(self.row_counter)+self.page.start_index()
# self.page.sart_index() is default Table function and return number of start index per page
我正在尝试使用 django-tables2 在 table 的第一列添加一个计数器,但下面的解决方案仅在 # 列下显示所有 0。我应该如何添加一列,其中有一列对行进行编号?
tables.py:
import django_tables2 as tables
from profiles.models import Track
import itertools
counter = itertools.count()
class PlaylistTable(tables.Table):
priority = tables.Column(verbose_name="#", default=next(counter))
class Meta:
model = Track
attrs = {"class": "paleblue"}
orderable = False
fields = ('priority', 'artist', 'title')
我的模板:
{% render_table table %}
来自 Column
default (str or callable)
:The default value for the column. This can be a value or a callable object
[1]
. If an object in the data providesNone
for a column, the default will be used instead.
[1] - The provided callable object must not expect to receive any arguments.
你传递的是什么next(counter)
你传递的是一个似乎是整数的函数的结果。
您可以定义一个函数:
def next_count():
return next(counter)
并且,将其用作默认值:
priority = tables.Column(verbose_name="#", default=next_count)
或者,您可以使用 @Sayse 评论中提到的 lambda 函数:
priority = tables.Column(verbose_name="#", default=lambda: next(counter))
其他答案在 tables.py
文件的顶层范围内都有 itertools.count
实例。这使得计数器在页面加载之间持续存在,它只会在服务器重新启动时重置。更好的解决方案是像这样在 table 上添加计数器作为实例变量:
import django_tables2 as tables
import itertools
class CountryTable(tables.Table):
counter = tables.Column(empty_values=(), orderable=False)
def render_counter(self):
self.row_counter = getattr(self, 'row_counter', itertools.count())
return next(self.row_counter)
这将确保每次实例化 table 时都会重置计数器。
基于 Jieter 的回答,您可以通过以下小修改来处理分页:
import django_tables2 as tables
import itertools
class CountryTable(tables.Table):
counter = tables.Column(empty_values=(), orderable=False)
def render_counter(self):
self.row_counter = getattr(self, 'row_counter',
itertools.count(self.page.start_index()))
return next(self.row_counter)
即使在第一页之后的页面中,行编号也是全局正确的。请注意,在这种情况下索引是基于 1 的。
添加到杰特的回答中, 在你的 table class 中,实现这些功能。 init 方法用于从视图 class 获取请求变量以获取页码。 将 render_id 更改为 render_yourcolumn 名称。
class ClassName:
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super(ClassName, self).__init__(*args, **kwargs)
def render_id(self):
page = int(self.request.GET.get('page', 1)) - 1
self.row_counter = getattr(self, 'row_counter', itertools.count(start=page*25+1)) # Change 25 to the number of rows in one page
return next(self.row_counter)
现在在视图文件中,将您的 Table class 命名为:
table = ClassName(ModelName.objects.values(), request=request)
通过这种方法,您的计数器将正确显示 n 页数。 :)
有类似的问题,但没有找到任何简单的解决方案可以在分页表上工作,而无需在每页上重置计数器
来自官方FAQ:How to create a row counter?(不支持分页)
使用已有的分页器属性: (类似一般的 django 方法)
import django_tables2 as tables
class NumberedTable(tables.Table):
serial_column = tables.TemplateColumn(
verbose_name='#',
"{{ row_counter|add:table.page.start_index }}",
)
...
这是一个不专业的方法,没有使用 itertools 模块:
import django_tables2 as table
class GenericTable(table.Table):
"""GenericTable
"""
counter = table.Column(
verbose_name='#',
orderable=False,
accessor='pk',
)
def render_counter(self, record):
"""render_counter
:param record: record
:return: custom render
"""
records = list(self.data)
index = records.index(record)
# counter = index # counter starts from 0
counter = index + 1 # counter starts from 1
return counter
来自Jieter 回答
如果不想让每一页都从零开始,您可以这样做:
import django_tables2 as tables
import itertools
class CountryTable(tables.Table):
counter = tables.Column(empty_values=(), orderable=False)
def render_counter(self):
self.row_counter = getattr(self, 'row_counter', itertools.count())
return next(self.row_counter)+self.page.start_index()
# self.page.sart_index() is default Table function and return number of start index per page