summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantoliny0919 <antoliny0919@gmail.com>2024-12-25 11:35:27 +0900
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2025-01-10 12:57:53 +0100
commit97ee8b82c2c99bf352df5359bb24a42ea78585b8 (patch)
treecf714ede8d5d8ec504b276bdf7c88114a5324c0f
parent585160586336f3bcd7b694f53cf10db73c56981c (diff)
Fixed #36032 -- Rendered URLField values as links in the admin.
-rw-r--r--django/contrib/admin/utils.py2
-rw-r--r--docs/releases/5.2.txt2
-rw-r--r--tests/admin_changelist/admin.py4
-rw-r--r--tests/admin_changelist/models.py1
-rw-r--r--tests/admin_changelist/tests.py11
-rw-r--r--tests/admin_utils/tests.py9
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('<a href="{}">{}</a>', value.url, value)
+ elif isinstance(field, models.URLField) and value and not avoid_link:
+ return format_html('<a href="{}">{}</a>', 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 <extrabody>` for adding custom code before the closing
``</body>`` 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,
'<a href="/admin/admin_changelist/genre/%s/change/">'
"documents/blues_history.txt</a>" % g.pk,
)
+ self.assertContains(
+ response,
+ '<a href="/admin/admin_changelist/genre/%s/change/">'
+ "http://blues_history.com</a>" % 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 = '<a href="http://example.com">http://example.com</a>'
+ 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