diff --git a/datasette/views/table.py b/datasette/views/table.py index aab4bbe3..d014db71 100644 --- a/datasette/views/table.py +++ b/datasette/views/table.py @@ -527,7 +527,7 @@ class TableView(RowTableShared): extra_args = {} # Handle ?_size=500 - page_size = _size or request.args.get("_size") + page_size = _size or request.args.get("_size") or table_metadata.get("size") if page_size: if page_size == "max": page_size = self.ds.max_returned_rows diff --git a/docs/metadata.rst b/docs/metadata.rst index 3cb1f739..88ad5854 100644 --- a/docs/metadata.rst +++ b/docs/metadata.rst @@ -156,6 +156,29 @@ Or use ``"sort_desc"`` to sort in descending order: } } +.. _metadata_page_size: + +Setting a custom page size +-------------------------- + +Datasette defaults to displaing 100 rows per page, for both tables and views. You can change this default page size on a per-table or per-view basis using the ``"size"`` key in ``metadata.json``: + +.. code-block:: json + + { + "databases": { + "mydatabase": { + "tables": { + "example_table": { + "size": 10 + } + } + } + } + } + +This size can still be over-ridden by passing e.g. ``?_size=50`` in the querystring. + .. _metadata_sortable_columns: Setting which columns can be used for sorting diff --git a/tests/fixtures.py b/tests/fixtures.py index 1eaa1dfe..9479abf6 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -305,6 +305,7 @@ METADATA = { }, "attraction_characteristic": {"sort_desc": "pk"}, "facet_cities": {"sort": "name"}, + "paginated_view": {"size": 25}, }, "queries": { "𝐜𝐢𝐭𝐢𝐞𝐬": "select id, name from facet_cities order by id limit 1;", diff --git a/tests/test_api.py b/tests/test_api.py index f92da45e..eb80f8e7 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -754,9 +754,9 @@ def test_table_with_reserved_word_name(app_client): "path,expected_rows,expected_pages", [ ("/fixtures/no_primary_key.json", 201, 5), - ("/fixtures/paginated_view.json", 201, 5), + ("/fixtures/paginated_view.json", 201, 9), ("/fixtures/no_primary_key.json?_size=25", 201, 9), - ("/fixtures/paginated_view.json?_size=25", 201, 9), + ("/fixtures/paginated_view.json?_size=50", 201, 5), ("/fixtures/paginated_view.json?_size=max", 201, 3), ("/fixtures/123_starts_with_digits.json", 0, 1), # Ensure faceting doesn't break pagination: