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 @@
{% 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):