0

「リクエスト」ライブラリを使用して API からデータをフェッチしており、html テーブルに 1 ページあたり 10 項目を表示したいと考えています。そのため、API から合計オブジェクト数 (1000 個のアイテムがあると仮定) で 10 個のアイテムを取得しています。データを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() をサポートし、キーベースで列の値にアクセスする項目を含む iterable は問題ありません。

そのため、len() が呼び出されたときにデータの長さを要求する API 呼び出しの周りに独自のラッパー クラスを作成できます。

以下に示すように、データセット全体ではなく、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 テーブル コンストラクターに渡します。

于 2013-11-12T09:48:58.457 に答える