Loading django/forms/widgets.py +8 −0 Original line number Diff line number Diff line Loading @@ -377,6 +377,14 @@ class ClearableFileInput(FileInput): """ Return whether value is considered to be initial value. """ # hasattr() masks exceptions on Python 2. if six.PY2: try: getattr(value, 'url') except AttributeError: return False else: return bool(value) return bool(value and hasattr(value, 'url')) def get_template_substitution_values(self, value): Loading tests/forms_tests/tests/test_widgets.py +19 −0 Original line number Diff line number Diff line Loading @@ -1345,6 +1345,25 @@ class ClearableFileInputTests(TestCase): self.assertIn('my<div>file', output) self.assertNotIn('my<div>file', output) def test_html_does_not_mask_exceptions(self): """ A ClearableFileInput should not mask exceptions produced while checking that it has a value. """ @python_2_unicode_compatible class FailingURLFieldFile(object): @property def url(self): raise RuntimeError('Canary') def __str__(self): return 'value' widget = ClearableFileInput() field = FailingURLFieldFile() with self.assertRaisesMessage(RuntimeError, 'Canary'): widget.render('myfile', field) def test_clear_input_renders_only_if_not_required(self): """ A ClearableFileInput with is_required=False does not render a clear Loading Loading
django/forms/widgets.py +8 −0 Original line number Diff line number Diff line Loading @@ -377,6 +377,14 @@ class ClearableFileInput(FileInput): """ Return whether value is considered to be initial value. """ # hasattr() masks exceptions on Python 2. if six.PY2: try: getattr(value, 'url') except AttributeError: return False else: return bool(value) return bool(value and hasattr(value, 'url')) def get_template_substitution_values(self, value): Loading
tests/forms_tests/tests/test_widgets.py +19 −0 Original line number Diff line number Diff line Loading @@ -1345,6 +1345,25 @@ class ClearableFileInputTests(TestCase): self.assertIn('my<div>file', output) self.assertNotIn('my<div>file', output) def test_html_does_not_mask_exceptions(self): """ A ClearableFileInput should not mask exceptions produced while checking that it has a value. """ @python_2_unicode_compatible class FailingURLFieldFile(object): @property def url(self): raise RuntimeError('Canary') def __str__(self): return 'value' widget = ClearableFileInput() field = FailingURLFieldFile() with self.assertRaisesMessage(RuntimeError, 'Canary'): widget.render('myfile', field) def test_clear_input_renders_only_if_not_required(self): """ A ClearableFileInput with is_required=False does not render a clear Loading