瀏覽代碼

Fixed #35606, Refs #34045 -- Fixed rendering of ModelAdmin.action_checkbox for models with a __html__ method.

Thank you Claude Paroz for the report.

Regression in 85366fbca723c9b37d0ac9db1d44e3f1cb188db2.
Hisham Mahmood 8 月之前
父節點
當前提交
182f262b15
共有 5 個文件被更改,包括 41 次插入1 次删除
  1. 1 0
      AUTHORS
  2. 3 1
      django/contrib/admin/options.py
  3. 4 0
      docs/releases/5.0.8.txt
  4. 6 0
      tests/admin_changelist/models.py
  5. 27 0
      tests/admin_changelist/tests.py

+ 1 - 0
AUTHORS

@@ -416,6 +416,7 @@ answer newbie questions, and generally made Django that much better:
     Himanshu Chauhan <hchauhan1404@outlook.com>
     hipertracker@gmail.com
     Hiroki Kiyohara <hirokiky@gmail.com>
+    Hisham Mahmood <hishammahmood41@gmail.com>
     Honza Král <honza.kral@gmail.com>
     Horst Gutmann <zerok@zerokspot.com>
     Hugo Osvaldo Barrera <hugo@barrera.io>

+ 3 - 1
django/contrib/admin/options.py

@@ -1026,7 +1026,9 @@ class ModelAdmin(BaseModelAdmin):
         """
         attrs = {
             "class": "action-select",
-            "aria-label": format_html(_("Select this object for an action - {}"), obj),
+            "aria-label": format_html(
+                _("Select this object for an action - {}"), str(obj)
+            ),
         }
         checkbox = forms.CheckboxInput(attrs, lambda value: False)
         return checkbox.render(helpers.ACTION_CHECKBOX_NAME, str(obj.pk))

+ 4 - 0
docs/releases/5.0.8.txt

@@ -11,3 +11,7 @@ Bugfixes
 
 * Added missing validation for ``UniqueConstraint(nulls_distinct=False)`` when
   using ``*expressions`` (:ticket:`35594`).
+
+* Fixed a regression in Django 5.0 where ``ModelAdmin.action_checkbox`` could
+  break the admin changelist HTML page when rendering a model instance with a
+  ``__html__`` method (:ticket:`35606`).

+ 6 - 0
tests/admin_changelist/models.py

@@ -23,6 +23,12 @@ class GrandChild(models.Model):
     parent = models.ForeignKey(Child, models.SET_NULL, editable=False, null=True)
     name = models.CharField(max_length=30, blank=True)
 
+    def __str__(self):
+        return self.name
+
+    def __html__(self):
+        return f'<h2 class="main">{self.name}</h2>'
+
 
 class Genre(models.Model):
     name = models.CharField(max_length=20)

+ 27 - 0
tests/admin_changelist/tests.py

@@ -364,6 +364,33 @@ class ChangeListTests(TestCase):
             table_output,
         )
 
+    def test_action_checkbox_for_model_with_dunder_html(self):
+        grandchild = GrandChild.objects.create(name="name")
+        request = self._mocked_authenticated_request("/grandchild/", self.superuser)
+        m = GrandChildAdmin(GrandChild, custom_site)
+        cl = m.get_changelist_instance(request)
+        cl.formset = None
+        template = Template(
+            "{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}"
+        )
+        context = Context({"cl": cl, "opts": GrandChild._meta})
+        table_output = template.render(context)
+        link = reverse(
+            "admin:admin_changelist_grandchild_change", args=(grandchild.id,)
+        )
+        row_html = build_tbody_html(
+            grandchild,
+            link,
+            "name",
+            '<td class="field-parent__name">-</td>'
+            '<td class="field-parent__parent__name">-</td>',
+        )
+        self.assertNotEqual(
+            table_output.find(row_html),
+            -1,
+            "Failed to find expected row element: %s" % table_output,
+        )
+
     def test_result_list_editable_html(self):
         """
         Regression tests for #11791: Inclusion tag result_list generates a