From 2f4def432d397b693bb6db32b8f5e7d94cbb2237 Mon Sep 17 00:00:00 2001 From: "utkarsh.arya@zomato.com" Date: Sat, 15 Nov 2025 22:57:35 +0000 Subject: [PATCH] Move required attribute logic to FileInput for initial data Ensure FileInput omits the required attribute when initial data exists, preventing unnecessary validation for already uploaded files. Fixes unexpected required field behavior when editing existing file fields. --- django/forms/widgets.py | 6 +++--- tests/forms_tests/widget_tests/test_fileinput.py | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/django/forms/widgets.py b/django/forms/widgets.py index 338d54d72f..40ac1d3162 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -387,6 +387,9 @@ class FileInput(Input): def value_omitted_from_data(self, data, files, name): return name not in files + def use_required_attribute(self, initial): + return super().use_required_attribute(initial) and not initial + FILE_INPUT_CONTRADICTION = object() @@ -451,9 +454,6 @@ class ClearableFileInput(FileInput): return False return upload - def use_required_attribute(self, initial): - return super().use_required_attribute(initial) and not initial - def value_omitted_from_data(self, data, files, name): return ( super().value_omitted_from_data(data, files, name) and diff --git a/tests/forms_tests/widget_tests/test_fileinput.py b/tests/forms_tests/widget_tests/test_fileinput.py index bbd7c7fe52..8eec26253a 100644 --- a/tests/forms_tests/widget_tests/test_fileinput.py +++ b/tests/forms_tests/widget_tests/test_fileinput.py @@ -18,3 +18,9 @@ class FileInputTest(WidgetTest): def test_value_omitted_from_data(self): self.assertIs(self.widget.value_omitted_from_data({}, {}, 'field'), True) self.assertIs(self.widget.value_omitted_from_data({}, {'field': 'value'}, 'field'), False) + + def test_use_required_attribute(self): + # False when initial data exists. The file input is left blank by the + # user to keep the existing, initial value. + self.assertIs(self.widget.use_required_attribute(None), True) + self.assertIs(self.widget.use_required_attribute('resume.txt'), False)