diff options
| author | Julien Rebetez <julien@fhtagn.net> | 2020-01-18 19:03:03 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-10-08 19:53:49 +0200 |
| commit | b79088306513d5ed76d31ac40ab3c15f858946ea (patch) | |
| tree | e384bad39afe191ff65fba937b0f4ff7a3a8c8cb /django/contrib/admin/helpers.py | |
| parent | 855fc06236630464055b4f9ea422c68a07c6d02a (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.py | 23 |
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) |
