summaryrefslogtreecommitdiff
path: root/django/contrib/admin/helpers.py
diff options
context:
space:
mode:
authorJulien Rebetez <julien@fhtagn.net>2020-01-18 19:03:03 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-10-08 19:53:49 +0200
commitb79088306513d5ed76d31ac40ab3c15f858946ea (patch)
treee384bad39afe191ff65fba937b0f4ff7a3a8c8cb /django/contrib/admin/helpers.py
parent855fc06236630464055b4f9ea422c68a07c6d02a (diff)
Fixed #31181 -- Added links to related models for admin's readonly fields.
Diffstat (limited to 'django/contrib/admin/helpers.py')
-rw-r--r--django/contrib/admin/helpers.py23
1 files changed, 21 insertions, 2 deletions
diff --git a/django/contrib/admin/helpers.py b/django/contrib/admin/helpers.py
index 56d7970d2a..6f0be6b148 100644
--- a/django/contrib/admin/helpers.py
+++ b/django/contrib/admin/helpers.py
@@ -3,12 +3,15 @@ import json
from django import forms
from django.contrib.admin.utils import (
display_for_field, flatten_fieldsets, help_text_for_field, label_for_field,
- lookup_field,
+ lookup_field, quote,
)
from django.core.exceptions import ObjectDoesNotExist
-from django.db.models import ManyToManyRel
+from django.db.models.fields.related import (
+ ForeignObjectRel, ManyToManyRel, OneToOneField,
+)
from django.forms.utils import flatatt
from django.template.defaultfilters import capfirst, linebreaksbr
+from django.urls import NoReverseMatch, reverse
from django.utils.html import conditional_escape, format_html
from django.utils.safestring import mark_safe
from django.utils.translation import gettext, gettext_lazy as _
@@ -187,6 +190,17 @@ class AdminReadonlyField:
label = self.field['label']
return format_html('<label{}>{}{}</label>', flatatt(attrs), capfirst(label), self.form.label_suffix)
+ def get_admin_url(self, remote_field, remote_obj):
+ url_name = 'admin:%s_%s_change' % (
+ remote_field.model._meta.app_label,
+ remote_field.model._meta.model_name,
+ )
+ try:
+ url = reverse(url_name, args=[quote(remote_obj.pk)])
+ return format_html('<a href="{}">{}</a>', url, remote_obj)
+ except NoReverseMatch:
+ return str(remote_obj)
+
def contents(self):
from django.contrib.admin.templatetags.admin_list import _boolean_icon
field, obj, model_admin = self.field['field'], self.form.instance, self.model_admin
@@ -212,6 +226,11 @@ class AdminReadonlyField:
else:
if isinstance(f.remote_field, ManyToManyRel) and value is not None:
result_repr = ", ".join(map(str, value.all()))
+ elif (
+ isinstance(f.remote_field, (ForeignObjectRel, OneToOneField)) and
+ value is not None
+ ):
+ result_repr = self.get_admin_url(f.remote_field, value)
else:
result_repr = display_for_field(value, f, self.empty_value_display)
result_repr = linebreaksbr(result_repr)