diff --git a/django/contrib/admin/templates/admin/widgets/clearable_file_input.html b/django/contrib/admin/templates/admin/widgets/clearable_file_input.html index ab35253a0d..8b42f192f1 100644 --- a/django/contrib/admin/templates/admin/widgets/clearable_file_input.html +++ b/django/contrib/admin/templates/admin/widgets/clearable_file_input.html @@ -1,6 +1,6 @@ {% if widget.is_initial %}<p class="file-upload">{{ widget.initial_text }}: <a href="{{ widget.value.url }}">{{ widget.value }}</a>{% if not widget.required %} <span class="clearable-file-input"> -<input type="checkbox" name="{{ widget.checkbox_name }}" id="{{ widget.checkbox_id }}"{% include "django/forms/widgets/attrs.html" %}> +<input type="checkbox" name="{{ widget.checkbox_name }}" id="{{ widget.checkbox_id }}"{% if widget.attrs.disabled %} disabled{% endif %}{% if widget.attrs.checked %} checked{% endif %}> <label for="{{ widget.checkbox_id }}">{{ widget.clear_checkbox_label }}</label></span>{% endif %}<br> {{ widget.input_text }}:{% endif %} <input type="{{ widget.type }}" name="{{ widget.name }}"{% include "django/forms/widgets/attrs.html" %}>{% if widget.is_initial %}</p>{% endif %} diff --git a/docs/releases/5.0.4.txt b/docs/releases/5.0.4.txt index d15c28d83d..9b2fd6b170 100644 --- a/docs/releases/5.0.4.txt +++ b/docs/releases/5.0.4.txt @@ -13,3 +13,7 @@ Bugfixes fields with expressions in ``db_default``. As a consequence, ``Model.full_clean()`` no longer validates for empty values in fields with ``db_default`` (:ticket:`35223`). + +* Fixed a regression in Django 5.0 where the ``AdminFileWidget`` could be + rendered with two ``id`` attributes on the "Clear" checkbox + (:ticket:`35273`). diff --git a/tests/admin_widgets/tests.py b/tests/admin_widgets/tests.py index 50c26095ff..76a47e4868 100644 --- a/tests/admin_widgets/tests.py +++ b/tests/admin_widgets/tests.py @@ -590,6 +590,19 @@ class AdminFileWidgetTests(TestDataMixin, TestCase): '<input type="file" name="test">', ) + def test_render_with_attrs_id(self): + storage_url = default_storage.url("") + w = widgets.AdminFileWidget() + self.assertHTMLEqual( + w.render("test", self.album.cover_art, attrs={"id": "test_id"}), + f'<p class="file-upload">Currently: <a href="{storage_url}albums/' + r'hybrid_theory.jpg">albums\hybrid_theory.jpg</a> ' + '<span class="clearable-file-input">' + '<input type="checkbox" name="test-clear" id="test-clear_id"> ' + '<label for="test-clear_id">Clear</label></span><br>' + 'Change: <input type="file" name="test" id="test_id"></p>', + ) + def test_render_required(self): widget = widgets.AdminFileWidget() widget.is_required = True @@ -618,6 +631,20 @@ class AdminFileWidgetTests(TestDataMixin, TestCase): }, ) + def test_render_checked(self): + storage_url = default_storage.url("") + widget = widgets.AdminFileWidget() + widget.checked = True + self.assertHTMLEqual( + widget.render("test", self.album.cover_art), + f'<p class="file-upload">Currently: <a href="{storage_url}albums/' + r'hybrid_theory.jpg">albums\hybrid_theory.jpg</a> ' + '<span class="clearable-file-input">' + '<input type="checkbox" name="test-clear" id="test-clear_id" checked>' + '<label for="test-clear_id">Clear</label></span><br>' + 'Change: <input type="file" name="test" checked></p>', + ) + def test_readonly_fields(self): """ File widgets should render as a link when they're marked "read only."