瀏覽代碼

Fixed #24727 -- Prevented ClearableFileInput from masking exceptions on Python 2

Berker Peksag 9 年之前
父節點
當前提交
043383e3f3
共有 2 個文件被更改,包括 40 次插入1 次删除
  1. 1 1
      django/forms/widgets.py
  2. 39 0
      tests/forms_tests/widget_tests/test_clearablefileinput.py

+ 1 - 1
django/forms/widgets.py

@@ -372,7 +372,7 @@ class ClearableFileInput(FileInput):
         """
         Return whether value is considered to be initial value.
         """
-        return bool(value and hasattr(value, 'url'))
+        return bool(value and getattr(value, 'url', False))
 
     def get_template_substitution_values(self, value):
         """

+ 39 - 0
tests/forms_tests/widget_tests/test_clearablefileinput.py

@@ -105,3 +105,42 @@ class ClearableFileInputTest(WidgetTest):
             name='myfile',
         )
         self.assertEqual(value, field)
+
+    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 ValueError('Canary')
+
+            def __str__(self):
+                return 'value'
+
+        with self.assertRaisesMessage(ValueError, 'Canary'):
+            self.widget.render('myfile', FailingURLFieldFile())
+
+    def test_url_as_property(self):
+        @python_2_unicode_compatible
+        class URLFieldFile(object):
+            @property
+            def url(self):
+                return 'https://www.python.org/'
+
+            def __str__(self):
+                return 'value'
+
+        html = self.widget.render('myfile', URLFieldFile())
+        self.assertInHTML('<a href="https://www.python.org/">value</a>', html)
+
+    def test_return_false_if_url_does_not_exists(self):
+        @python_2_unicode_compatible
+        class NoURLFieldFile(object):
+            def __str__(self):
+                return 'value'
+
+        html = self.widget.render('myfile', NoURLFieldFile())
+        self.assertHTMLEqual(html, '<input name="myfile" type="file" />')