0

我正在使用“请求”库从 API 获取数据,并且我想在 html 表中每页显示 10 个项目。所以我从 API 中获取 10 个项目,总对象数(假设有 1000 个项目)。当我将数据推送到 html 表时,没有创建分页,因为我不知道如何将总项目数分配给表。

# tables.py
class CustomerTable(tables.Table):
    id = tables.Column()
    name = tables.LinkColumn('customer:edit', kwargs={'id': A('id')})

    class Meta:
        order_by = 'name'


# views.py
# content of a view
data = {'total_count': 1000, "objects": [{'id':1, 'name': 'foo'}, {'id':2, 'name': 'bar'}, {'id':3, 'name': 'baz'}]}
table = CustomerTable(data['objects'])
table.paginate(page=self.request.GET.get('page', 1), per_page=1)

self.render_to_response({'table': table})

问题:如何将总项目计数(data['total_count'])分配给表进行分页?

4

1 回答 1

3

这里的文档:

表与一系列输入数据结构兼容。如果您看过本教程,您会看到正在使用查询集,但是任何支持 len() 并包含公开基于键访问列值的项的迭代都可以。

因此,您可以围绕 API 调用创建自己的包装类,该类在调用 len() 时请求数据的长度。

这样的事情可能会起作用,尽管您可能希望对其进行优化以仅访问 API 并仅返回所需的项目,而不是下面建议的整个数据集。

class ApiDataset(object):
    def __init__(self, api_addr):
        self.http_api_addr = api_addr
        self.data = None

    def cache_data(self):
        # Access API and cache returned data on object.
        if self.data is None:
            self.data = get_data_from_api()

    def __iter__(self):
        self.cache_results()
        for item in self.data['objects']:
            yield item

    def __len__(self):
        self.cache_results()
        return self.data['total_count']

使用此设置,您可以将 APIDataset 实例传递给 django-tables2 Table 构造函数。

于 2013-11-12T09:48:58.457 回答