django-tables2 - 如何使用非查询集数据分页分配总项数?

时间:2013-11-11 15:52:36

标签: python django django-tables2

我从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'])分配给表格进行分页?

1 个答案:

答案 0 :(得分:3)

来自文档here

  

表与一系列输入数据结构兼容。如果你的话   看过教程,你会看到一个正在使用的查询集,无论如何   iterable,支持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表构造函数。