From 97ee8b82c2c99bf352df5359bb24a42ea78585b8 Mon Sep 17 00:00:00 2001 From: antoliny0919 Date: Wed, 25 Dec 2024 11:35:27 +0900 Subject: [PATCH] Fixed #36032 -- Rendered URLField values as links in the admin. --- django/contrib/admin/utils.py | 2 ++ docs/releases/5.2.txt | 2 ++ tests/admin_changelist/admin.py | 4 ++-- tests/admin_changelist/models.py | 1 + tests/admin_changelist/tests.py | 11 ++++++++++- tests/admin_utils/tests.py | 9 +++++++++ 6 files changed, 26 insertions(+), 3 deletions(-) diff --git a/django/contrib/admin/utils.py b/django/contrib/admin/utils.py index 0fe0e4e6e6..cc8ca5604d 100644 --- a/django/contrib/admin/utils.py +++ b/django/contrib/admin/utils.py @@ -454,6 +454,8 @@ def display_for_field(value, field, empty_value_display, avoid_link=False): return formats.number_format(value) elif isinstance(field, models.FileField) and value and not avoid_link: return format_html('{}', value.url, value) + elif isinstance(field, models.URLField) and value and not avoid_link: + return format_html('{}', value, value) elif isinstance(field, models.JSONField) and value: try: return json.dumps(value, ensure_ascii=False, cls=field.encoder) diff --git a/docs/releases/5.2.txt b/docs/releases/5.2.txt index 35ce053861..3d3a958b6d 100644 --- a/docs/releases/5.2.txt +++ b/docs/releases/5.2.txt @@ -80,6 +80,8 @@ Minor features :ref:`extrabody ` for adding custom code before the closing ```` tag. +* The value of a :class:`~django.db.models.URLField` now renders as a link. + :mod:`django.contrib.admindocs` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/tests/admin_changelist/admin.py b/tests/admin_changelist/admin.py index 701d60cd05..910cd90d9e 100644 --- a/tests/admin_changelist/admin.py +++ b/tests/admin_changelist/admin.py @@ -158,8 +158,8 @@ site.register(Parent, NoListDisplayLinksParentAdmin) class ListDisplayLinksGenreAdmin(admin.ModelAdmin): - list_display = ["name", "file"] - list_display_links = ["file"] + list_display = ["name", "file", "url"] + list_display_links = ["file", "url"] site.register(Genre, ListDisplayLinksGenreAdmin) diff --git a/tests/admin_changelist/models.py b/tests/admin_changelist/models.py index 6b2fba4ced..a84c27a066 100644 --- a/tests/admin_changelist/models.py +++ b/tests/admin_changelist/models.py @@ -33,6 +33,7 @@ class GrandChild(models.Model): class Genre(models.Model): name = models.CharField(max_length=20) file = models.FileField(upload_to="documents/", blank=True, null=True) + url = models.URLField(blank=True, null=True) class Band(models.Model): diff --git a/tests/admin_changelist/tests.py b/tests/admin_changelist/tests.py index f682ac60bb..8e4557c7c5 100644 --- a/tests/admin_changelist/tests.py +++ b/tests/admin_changelist/tests.py @@ -1059,13 +1059,22 @@ class ChangeListTests(TestCase): def test_link_field_display_links(self): self.client.force_login(self.superuser) - g = Genre.objects.create(name="Blues", file="documents/blues_history.txt") + g = Genre.objects.create( + name="Blues", + file="documents/blues_history.txt", + url="http://blues_history.com", + ) response = self.client.get(reverse("admin:admin_changelist_genre_changelist")) self.assertContains( response, '' "documents/blues_history.txt" % g.pk, ) + self.assertContains( + response, + '' + "http://blues_history.com" % g.pk, + ) def test_clear_all_filters_link(self): self.client.force_login(self.superuser) diff --git a/tests/admin_utils/tests.py b/tests/admin_utils/tests.py index 56d46324e0..77d6655290 100644 --- a/tests/admin_utils/tests.py +++ b/tests/admin_utils/tests.py @@ -157,6 +157,7 @@ class UtilsTests(SimpleTestCase): models.DateField(), models.DecimalField(), models.FloatField(), + models.URLField(), models.JSONField(), models.TimeField(), ] @@ -196,6 +197,14 @@ class UtilsTests(SimpleTestCase): display_value, ) + def test_url_display_for_field(self): + model_field = models.URLField() + display_value = display_for_field( + "http://example.com", model_field, self.empty_value + ) + expected = 'http://example.com' + self.assertHTMLEqual(display_value, expected) + def test_number_formats_display_for_field(self): display_value = display_for_field( 12345.6789, models.FloatField(), self.empty_value