From dadf5df6a05c7b668ce86dca019e7d8d5f461c76 Mon Sep 17 00:00:00 2001 From: kyb Date: Sat, 28 Mar 2026 14:13:59 +0900 Subject: [PATCH 1/3] Fixed #37009 -- Fixed alignment of "Show/Hide counts" icons in admin changelist. --- django/contrib/admin/static/admin/css/base.css | 4 ++-- django/contrib/admin/static/admin/css/rtl.css | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/django/contrib/admin/static/admin/css/base.css b/django/contrib/admin/static/admin/css/base.css index dc6e24a476d9..963adafaa049 100644 --- a/django/contrib/admin/static/admin/css/base.css +++ b/django/contrib/admin/static/admin/css/base.css @@ -776,12 +776,12 @@ ol.breadcrumbs a:focus, ol.breadcrumbs a:hover { .viewlink, .inlineviewlink { padding-left: 16px; - background: url(../img/icon-viewlink.svg) 0 1px no-repeat; + background: url(../img/icon-viewlink.svg) 0 center no-repeat; } .hidelink { padding-left: 16px; - background: url(../img/icon-hidelink.svg) 0 1px no-repeat; + background: url(../img/icon-hidelink.svg) 0 center no-repeat; } .addlink { diff --git a/django/contrib/admin/static/admin/css/rtl.css b/django/contrib/admin/static/admin/css/rtl.css index 4726aceb9c4d..9164aa0f4b75 100644 --- a/django/contrib/admin/static/admin/css/rtl.css +++ b/django/contrib/admin/static/admin/css/rtl.css @@ -16,7 +16,7 @@ th { .viewlink, .addlink, .changelink, .hidelink { padding-left: 0; padding-right: 16px; - background-position: 100% 1px; + background-position-x: 100%; } .deletelink { From eb244b011716d62b22dbca45f0a621a6192cad67 Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Sat, 4 Apr 2026 17:58:05 -0400 Subject: [PATCH 2/3] Refs #37023 -- Removed hardcoded indent levels from XML serializer. This facilitates nested fields and objects. --- django/core/serializers/xml_serializer.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/django/core/serializers/xml_serializer.py b/django/core/serializers/xml_serializer.py index 3d1f79ea0d00..82a345d57fd3 100644 --- a/django/core/serializers/xml_serializer.py +++ b/django/core/serializers/xml_serializer.py @@ -48,6 +48,10 @@ def start_serialization(self): """ Start serialization -- open the XML document and the root element. """ + # Increment the indent_level before each startElement() and decrement + # it following each endElement(). If the closing tag should appear on + # its own line, use self.indent(self.indent_level) before endElement(). + self.indent_level = 0 self.xml = SimplerXMLGenerator( self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET) ) @@ -58,7 +62,7 @@ def end_serialization(self): """ End serialization -- end the document. """ - self.indent(0) + self.indent(self.indent_level) self.xml.endElement("django-objects") self.xml.endDocument() @@ -71,7 +75,8 @@ def start_object(self, obj): "Non-model object (%s) encountered during serialization" % type(obj) ) - self.indent(1) + self.indent_level += 1 + self.indent(self.indent_level) attrs = {"model": str(obj._meta)} if not self.use_natural_primary_keys or not self._resolve_natural_key(obj): obj_pk = obj.pk @@ -84,15 +89,17 @@ def end_object(self, obj): """ Called after handling all fields for an object. """ - self.indent(1) + self.indent(self.indent_level) self.xml.endElement("object") + self.indent_level -= 1 def handle_field(self, obj, field): """ Handle each field on an object (except for ForeignKeys and ManyToManyFields). """ - self.indent(2) + self.indent_level += 1 + self.indent(self.indent_level) self.xml.startElement( "field", { @@ -119,6 +126,7 @@ def handle_field(self, obj, field): self.xml.addQuickElement("None") self.xml.endElement("field") + self.indent_level -= 1 def handle_fk_field(self, obj, field): """ @@ -144,6 +152,7 @@ def handle_fk_field(self, obj, field): else: self.xml.addQuickElement("None") self.xml.endElement("field") + self.indent_level -= 1 def handle_m2m_field(self, obj, field): """ @@ -212,10 +221,12 @@ def queryset_iterator(obj, field): handle_m2m(relobj) self.xml.endElement("field") + self.indent_level -= 1 def _start_relational_field(self, field): """Output the element for relational fields.""" - self.indent(2) + self.indent_level += 1 + self.indent(self.indent_level) self.xml.startElement( "field", { From 33bfc66add643f49d466c5a646989ad91677753d Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Sat, 4 Apr 2026 18:02:17 -0400 Subject: [PATCH 3/3] Fixed #37023 -- Made XML serializer put each ManyToManyField object on its own line. --- django/core/serializers/xml_serializer.py | 8 +++++++- tests/serializers/test_xml.py | 5 ++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/django/core/serializers/xml_serializer.py b/django/core/serializers/xml_serializer.py index 82a345d57fd3..5dfbb76a01cf 100644 --- a/django/core/serializers/xml_serializer.py +++ b/django/core/serializers/xml_serializer.py @@ -199,6 +199,8 @@ def queryset_iterator(obj, field): else: def handle_m2m(value): + # Put each object on its own line. + self.indent(self.indent_level + 1) self.xml.addQuickElement("object", attrs={"pk": str(value.pk)}) def queryset_iterator(obj, field): @@ -217,9 +219,13 @@ def queryset_iterator(obj, field): field.name, queryset_iterator(obj, field), ) + relobj = None for relobj in m2m_iter: handle_m2m(relobj) - + if relobj: + # If there are related objects (which appear each on their own + # line), put the closing on the next line. + self.indent(self.indent_level) self.xml.endElement("field") self.indent_level -= 1 diff --git a/tests/serializers/test_xml.py b/tests/serializers/test_xml.py index 0ae66f77d018..884746dfac25 100644 --- a/tests/serializers/test_xml.py +++ b/tests/serializers/test_xml.py @@ -24,7 +24,10 @@ class XmlSerializerTestCase(SerializersTestBase, TestCase): %(author_pk)s Poker has no place on ESPN 2006-06-16T11:00:00 - + + + +