diff --git a/django/forms/widgets.py b/django/forms/widgets.py
index aa309a17a1..dd5868f479 100644
--- a/django/forms/widgets.py
+++ b/django/forms/widgets.py
@@ -330,12 +330,13 @@ class ClearableFileInput(FileInput):
if value and hasattr(value, "url"):
template = self.template_with_initial
substitutions['initial'] = (u'%s'
- % (value.url, value))
+ % (escape(value.url),
+ escape(force_unicode(value))))
if not self.is_required:
checkbox_name = self.clear_checkbox_name(name)
checkbox_id = self.clear_checkbox_id(checkbox_name)
- substitutions['clear_checkbox_name'] = checkbox_name
- substitutions['clear_checkbox_id'] = checkbox_id
+ substitutions['clear_checkbox_name'] = conditional_escape(checkbox_name)
+ substitutions['clear_checkbox_id'] = conditional_escape(checkbox_id)
substitutions['clear'] = CheckboxInput().render(checkbox_name, False, attrs={'id': checkbox_id})
substitutions['clear_template'] = self.template_with_clear % substitutions
diff --git a/tests/regressiontests/forms/tests/widgets.py b/tests/regressiontests/forms/tests/widgets.py
index 7d2b633778..4c5aeb0147 100644
--- a/tests/regressiontests/forms/tests/widgets.py
+++ b/tests/regressiontests/forms/tests/widgets.py
@@ -1086,6 +1086,28 @@ class ClearableFileInputTests(TestCase):
self.assertEqual(widget.render('myfile', FakeFieldFile()),
u'Currently: something
Change: ')
+ def test_html_escaped(self):
+ """
+ A ClearableFileInput should escape name, filename and URL when
+ rendering HTML. Refs #15182.
+ """
+
+ class StrangeFieldFile(object):
+ url = "something?chapter=1§=2©=3&lang=en"
+
+ def __unicode__(self):
+ return u'''something