diff --git a/datasette/views/table.py b/datasette/views/table.py index d87ac2aa..0a7e5265 100644 --- a/datasette/views/table.py +++ b/datasette/views/table.py @@ -273,7 +273,7 @@ async def display_columns_and_rows( link_template = LINK_WITH_LABEL if (label != value) else LINK_WITH_VALUE display_value = markupsafe.Markup( link_template.format( - database=database_name, + database=tilde_encode(database_name), base_url=base_url, table=tilde_encode(other_table), link_id=tilde_encode(str(value)), diff --git a/tests/test_table_html.py b/tests/test_table_html.py index 3152903d..81dbaa69 100644 --- a/tests/test_table_html.py +++ b/tests/test_table_html.py @@ -3,6 +3,7 @@ from bs4 import BeautifulSoup as Soup from .fixtures import ( # noqa app_client, make_app_client, + app_client_with_dot, ) import pathlib import pytest @@ -1291,3 +1292,9 @@ async def test_foreign_key_labels_obey_permissions(config): "rows": [{"id": 1, "name": "world", "a_id": 1}], "truncated": False, } + + +def test_foreign_keys_special_character_in_database_name(app_client_with_dot): + # https://github.com/simonw/datasette/pull/2476 + response = app_client_with_dot.get("/fixtures~2Edot/complex_foreign_keys") + assert 'world' in response.text