diff --git a/datasette/views/database.py b/datasette/views/database.py
index 77f3f5b0..0770a380 100644
--- a/datasette/views/database.py
+++ b/datasette/views/database.py
@@ -506,6 +506,21 @@ async def query_view(
show_hide_text = "hide"
hide_sql = show_hide_text == "show"
+ # Extract any :named parameters
+ named_parameters = await derive_named_parameters(
+ datasette.get_database(database), sql
+ )
+ named_parameter_values = {
+ named_parameter: params.get(named_parameter) or ""
+ for named_parameter in named_parameters
+ if not named_parameter.startswith("_")
+ }
+
+ # Set to blank string if missing from params
+ for named_parameter in named_parameters:
+ if named_parameter not in params and not named_parameter.startswith("_"):
+ params[named_parameter] = ""
+
r = Response.html(
await datasette.render_template(
template,
@@ -513,7 +528,7 @@ async def query_view(
database=database,
query={
"sql": sql,
- # TODO: Params?
+ "params": params,
},
canned_query=None,
private=private,
@@ -526,7 +541,7 @@ async def query_view(
editable=True, # TODO
allow_execute_sql=allow_execute_sql,
tables=await get_tables(datasette, request, db),
- named_parameter_values={}, # TODO
+ named_parameter_values=named_parameter_values,
edit_sql_url="todo",
display_rows=await display_rows(
datasette, database, request, rows, columns
diff --git a/tests/test_html.py b/tests/test_html.py
index 6c3860d7..7856bc27 100644
--- a/tests/test_html.py
+++ b/tests/test_html.py
@@ -295,6 +295,22 @@ async def test_query_json_csv_export_links(ds_client):
assert 'CSV' in response.text
+@pytest.mark.asyncio
+async def test_query_parameter_form_fields(ds_client):
+ response = await ds_client.get("/fixtures?sql=select+:name")
+ assert response.status_code == 200
+ assert (
+ ' '
+ in response.text
+ )
+ response2 = await ds_client.get("/fixtures?sql=select+:name&name=hello")
+ assert response2.status_code == 200
+ assert (
+ ' '
+ in response2.text
+ )
+
+
@pytest.mark.asyncio
async def test_row_html_simple_primary_key(ds_client):
response = await ds_client.get("/fixtures/simple_primary_key/1")