Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions django/contrib/admin/static/admin/css/widgets.css
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
padding: 8px;
}

.aligned .selector-chosen-title label {
.selector-chosen-title label {
color: var(--header-link-color);
width: 100%;
}
Expand All @@ -60,7 +60,7 @@
padding: 8px;
}

.aligned .selector-available-title label {
.selector-available-title label {
width: 100%;
}

Expand Down
15 changes: 11 additions & 4 deletions django/db/models/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -1142,23 +1142,30 @@ def _save_table(
),
)["_order__max"]
)
fields = [
insert_fields = [
f
for f in meta.local_concrete_fields
if not f.generated and (pk_set or f is not meta.auto_field)
]
returning_fields = list(meta.db_returning_fields)
for field in fields:
can_return_columns_from_insert = connections[
using
].features.can_return_columns_from_insert
for field in insert_fields:
value = (
getattr(self, field.attname) if raw else field.pre_save(self, False)
)
if hasattr(value, "resolve_expression"):
if field not in returning_fields:
returning_fields.append(field)
elif field.db_returning:
elif (
field.db_returning
and not can_return_columns_from_insert
and not (pk_set and field is meta.auto_field)
):
returning_fields.remove(field)
results = self._do_insert(
cls._base_manager, using, fields, returning_fields, raw
cls._base_manager, using, insert_fields, returning_fields, raw
)
if results:
self._assign_returned_values(results[0], returning_fields)
Expand Down
4 changes: 3 additions & 1 deletion docs/releases/5.2.7.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,6 @@ Django 5.2.7 fixes several bugs in 5.2.6.
Bugfixes
========

* ...
* Fixed a regression in Django 5.2 that reduced the color contrast of
the chosen label of ``filter_horizontal`` and ``filter_vertical`` widgets
within a ``TabularInline`` (:ticket:`36601`).
12 changes: 12 additions & 0 deletions tests/admin_inlines/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2558,3 +2558,15 @@ def test_tabular_inline_object_with_show_change_link(self):
self.assertTrue(object_str.is_displayed())
self.assertIn("Desert", object_str.text)
self.take_screenshot("tabular")

@screenshot_cases(["desktop_size", "mobile_size", "rtl", "dark", "high_contrast"])
def test_tabular_inline_with_filter_horizontal(self):
from selenium.webdriver.common.by import By

self.admin_login(username="super", password="secret")
self.selenium.get(
self.live_server_url + reverse("admin:admin_inlines_courseproxy2_add")
)
m2m_widget = self.selenium.find_element(By.CSS_SELECTOR, "div.selector")
self.assertTrue(m2m_widget.is_displayed())
self.take_screenshot("tabular")
8 changes: 8 additions & 0 deletions tests/basic/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,14 @@ def test_save_primary_with_falsey_db_default(self):
with self.assertNumQueries(1):
PrimaryKeyWithFalseyDbDefault().save()

def test_auto_field_with_value_refreshed(self):
"""
An auto field must be refreshed by Model.save() even when a value is
set because the database may return a value of a different type.
"""
a = Article.objects.create(pk="123456", pub_date=datetime(2025, 9, 16))
self.assertEqual(a.pk, 123456)


class ModelTest(TestCase):
def test_objects_attribute_is_only_available_on_the_class_itself(self):
Expand Down
5 changes: 5 additions & 0 deletions tests/queries/test_db_returning.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ def test_insert_returning_non_integer(self):
self.assertTrue(obj.created)
self.assertIsInstance(obj.created, datetime.datetime)

def test_insert_returning_non_integer_from_literal_value(self):
obj = NonIntegerPKReturningModel.objects.create(pk="2025-01-01")
self.assertTrue(obj.created)
self.assertIsInstance(obj.created, datetime.datetime)

def test_insert_returning_multiple(self):
with CaptureQueriesContext(connection) as captured_queries:
obj = ReturningModel.objects.create()
Expand Down
Loading