diff --git a/django/contrib/admin/templates/admin/change_list.html b/django/contrib/admin/templates/admin/change_list.html index 78eef882945d..4bb1b2f03be0 100644 --- a/django/contrib/admin/templates/admin/change_list.html +++ b/django/contrib/admin/templates/admin/change_list.html @@ -89,11 +89,11 @@

{% translate 'Filter' %}

{% if action_form and actions_on_bottom and cl.show_admin_actions %}{% admin_actions %}{% endif %} {% endblock %} {% block pagination %} - diff --git a/django/core/files/base.py b/django/core/files/base.py index 461ff8b8732e..67575958f83b 100644 --- a/django/core/files/base.py +++ b/django/core/files/base.py @@ -20,10 +20,10 @@ def __str__(self): return self.name or "" def __repr__(self): - return "<%s: %s>" % (self.__class__.__name__, self or "None") + return "<%s: %s>" % (self.__class__.__name__, self.name or "None") def __bool__(self): - return bool(self.name) + return True def __len__(self): return self.size @@ -134,9 +134,6 @@ def __init__(self, content, name=None): def __str__(self): return "Raw content" - def __bool__(self): - return True - def open(self, mode=None): self.seek(0) return self diff --git a/django/core/files/uploadedfile.py b/django/core/files/uploadedfile.py index 1d006ede4f3a..6646b1d7bf37 100644 --- a/django/core/files/uploadedfile.py +++ b/django/core/files/uploadedfile.py @@ -45,6 +45,9 @@ def __init__( def __repr__(self): return "<%s: %s (%s)>" % (self.__class__.__name__, self.name, self.content_type) + def __bool__(self): + return bool(self.name) + def _get_name(self): return self._name diff --git a/django/db/models/fields/files.py b/django/db/models/fields/files.py index dbf227ae92be..dc32e0d20983 100644 --- a/django/db/models/fields/files.py +++ b/django/db/models/fields/files.py @@ -34,6 +34,9 @@ def __eq__(self, other): def __hash__(self): return hash(self.name) + def __bool__(self): + return bool(self.name) + # The standard File contains most of the necessary properties, but # FieldFiles can be instantiated without a name, so that needs to # be checked for here. diff --git a/docs/releases/6.0.5.txt b/docs/releases/6.0.5.txt index dbe684e59b64..7e54cbe1a4e4 100644 --- a/docs/releases/6.0.5.txt +++ b/docs/releases/6.0.5.txt @@ -9,4 +9,7 @@ Django 6.0.5 fixes several bugs in 6.0.4. Bugfixes ======== -* ... +* Fixed a misplaced ```` in the + ``django/contrib/admin/templates/admin/change_list.html`` template added in + Django 6.0 that could be problematic when overriding the ``pagination`` block + (:ticket:`37029`). diff --git a/docs/releases/6.1.txt b/docs/releases/6.1.txt index 00eaf5388d05..77188e0c8ef2 100644 --- a/docs/releases/6.1.txt +++ b/docs/releases/6.1.txt @@ -500,6 +500,13 @@ Miscellaneous primary key when a ``QuerySet``'s ordering has been forcibly cleared by calling :meth:`~.QuerySet.order_by` with no arguments. +* The :class:`~django.core.files.File` class now always evaluates to ``True`` + in boolean contexts, rather than relying on the ``name`` attribute. The + built-in subclasses ``FieldFile``, ``UploadedFile``, + ``TemporaryUploadedFile``, ``InMemoryUploadedFile``, and + ``SimpleUploadedFile`` retain the previous behavior of evaluating based on + the ``name`` attribute. + .. _deprecated-features-6.1: Features deprecated in 6.1 diff --git a/tests/files/tests.py b/tests/files/tests.py index cfda70053f21..9ee27b741f99 100644 --- a/tests/files/tests.py +++ b/tests/files/tests.py @@ -233,6 +233,9 @@ def test_noname_file_default_name(self): def test_noname_file_get_size(self): self.assertEqual(File(BytesIO(b"A file with no name")).size, 19) + def test_noname_bool(self): + self.assertTrue(bool(File(BytesIO(b"A file with no name")))) + class ContentFileTestCase(unittest.TestCase): def test_content_file_default_name(self):