diff --git a/datasette/views/row.py b/datasette/views/row.py
index 077c33c2..718ee00c 100644
--- a/datasette/views/row.py
+++ b/datasette/views/row.py
@@ -140,9 +140,6 @@ class RowView(DataView):
break
if plugin_display_value:
rendered_row[column] = str(plugin_display_value)
- else:
- # Default: convert value to string
- rendered_row[column] = "" if value is None else str(value)
rendered_rows.append(rendered_row)
data["render_cell"] = rendered_rows
diff --git a/datasette/views/table.py b/datasette/views/table.py
index 9a3ae69f..b07b62ae 100644
--- a/datasette/views/table.py
+++ b/datasette/views/table.py
@@ -1516,9 +1516,6 @@ async def table_view_data(
break
if plugin_display_value:
rendered_row[column] = str(plugin_display_value)
- else:
- # Default: convert value to string
- rendered_row[column] = "" if value is None else str(value)
rendered_rows.append(rendered_row)
return rendered_rows
diff --git a/tests/test_api.py b/tests/test_api.py
index 1571fd5d..41bad84e 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -792,14 +792,15 @@ async def test_row_extra_render_cell():
assert "rows" in data
# render_cell should be a list with one row (since this is a row page)
+ # Only columns modified by plugins are included (sparse output)
render_cell = data["render_cell"]
assert len(render_cell) == 1
# The row: id=1, name='Alice'
# The 'name' column should be rendered by our plugin as Alice
assert render_cell[0]["name"] == "Alice"
- # The 'id' column should use default rendering (just the value as string)
- assert render_cell[0]["id"] == "1"
+ # The 'id' column is not included since no plugin modified it
+ assert "id" not in render_cell[0]
# The regular rows should still contain raw values
assert data["rows"] == [{"id": 1, "name": "Alice"}]
diff --git a/tests/test_table_api.py b/tests/test_table_api.py
index 25419bb8..527550fb 100644
--- a/tests/test_table_api.py
+++ b/tests/test_table_api.py
@@ -1426,18 +1426,19 @@ async def test_extra_render_cell():
assert "rows" in data
# render_cell should be a list of rows, each row being a dict of column -> rendered HTML
+ # Only columns modified by plugins are included (sparse output)
render_cell = data["render_cell"]
assert len(render_cell) == 2
# First row: id=1, name='Alice'
# The 'name' column should be rendered by our plugin as Alice
assert render_cell[0]["name"] == "Alice"
- # The 'id' column should use default rendering (just the value as string)
- assert render_cell[0]["id"] == "1"
+ # The 'id' column is not included since no plugin modified it
+ assert "id" not in render_cell[0]
# Second row: id=2, name='Bob'
assert render_cell[1]["name"] == "Bob"
- assert render_cell[1]["id"] == "2"
+ assert "id" not in render_cell[1]
# The regular rows should still contain raw values
assert data["rows"] == [