Code

Ticket #13165: change_links.diff

File change_links.diff, 5.6 KB (added by DrMeers, 4 years ago)

Draft patch. No tests yet.

Line 
1Index: django/contrib/admin/helpers.py
2===================================================================
3--- django/contrib/admin/helpers.py     (revision 13020)
4+++ django/contrib/admin/helpers.py     (working copy)
5@@ -12,8 +12,8 @@
6 from django.utils.html import escape, conditional_escape
7 from django.utils.safestring import mark_safe
8 from django.utils.translation import ugettext_lazy as _
9+from django.core.urlresolvers import reverse, NoReverseMatch
10 
11-
12 ACTION_CHECKBOX_NAME = '_selected_action'
13 
14 class ActionForm(forms.Form):
15@@ -186,6 +186,29 @@
16                     result_repr = display_for_field(value, f)
17         return conditional_escape(result_repr)
18 
19+    def change_url(self):
20+        """ Return admin change URL for field if applicable. """
21+        field, obj, model_admin = \
22+            self.field['field'], self.form.instance, self.model_admin
23+        try:
24+            f, attr, value = lookup_field(field, obj, model_admin)
25+        except (AttributeError, ValueError, ObjectDoesNotExist):
26+            return None
27+        else:
28+            rel = getattr(f,'rel')
29+            if rel and rel.to in model_admin.admin_site._registry:
30+                try:
31+                    return reverse('admin:%s_%s_change' % (
32+                            rel.to._meta.app_label,
33+                            rel.to._meta.object_name.lower()),
34+                                   args=(value.pk,),
35+                                   current_app=model_admin.admin_site.name)
36+                except NoReverseMatch:
37+                    return None # fail silently
38+            else:
39+                return None # not a related field
40+
41+   
42 class InlineAdminFormSet(object):
43     """
44     A wrapper around an inline formset for use in the admin system.
45Index: django/contrib/admin/widgets.py
46===================================================================
47--- django/contrib/admin/widgets.py     (revision 13020)
48+++ django/contrib/admin/widgets.py     (working copy)
49@@ -242,6 +242,31 @@
50             output.append(u'<a href="%s" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' % \
51                 (related_url, name))
52             output.append(u'<img src="%simg/admin/icon_addlink.gif" width="10" height="10" alt="%s"/></a>' % (settings.ADMIN_MEDIA_PREFIX, _('Add Another')))
53+
54+            if value: # (a related object is selected)
55+                try:
56+                    related_object = rel_to.objects.get(pk=value)
57+                except:
58+                    # probably a TypeError (e.g. value is list for
59+                    # multiple-select widgets), but fail silently regardless
60+                    pass
61+                else:
62+                    try:
63+                        change_related_url = reverse(
64+                            'admin:%s_%s_change' % info,
65+                            args=(related_object.id,),
66+                            current_app=self.admin_site.name)
67+                    except NoReverseMatch:
68+                        # fail silently
69+                        pass
70+                    else:
71+                        params = {
72+                            'url': change_related_url,
73+                            'admin_media_prefix': settings.ADMIN_MEDIA_PREFIX,
74+                            'text': _('edit %s' % related_object),
75+                            }
76+                        output.append(u' <a href="%(url)s" class="change_link"><img src="%(admin_media_prefix)simg/admin/icon_changelink.gif" width="10" height="10" alt="%(text)s" title="%(text)s"/> %(text)s</a>' % params)
77+               
78         return mark_safe(u''.join(output))
79 
80     def build_attrs(self, extra_attrs=None, **kwargs):
81Index: django/contrib/admin/templates/admin/edit_inline/tabular.html
82===================================================================
83--- django/contrib/admin/templates/admin/edit_inline/tabular.html       (revision 13020)
84+++ django/contrib/admin/templates/admin/edit_inline/tabular.html       (working copy)
85@@ -44,7 +45,7 @@
86             {% for field in line %}
87               <td class="{{ field.field.name }}">
88               {% if field.is_readonly %}
89-                  <p>{{ field.contents }}</p>
90+                  <p>{{ field.contents }} {% if field.change_url %}<a href="{{ field.change_url }}" class="readonly_field_change_link"><img src="{% admin_media_prefix %}img/admin/icon_changelink.gif" width="10" height="10" alt="{% trans "edit" %}" title="{% trans "edit" %}"/></a>{% endif %}</p>
91               {% else %}
92                   {{ field.field.errors.as_ul }}
93                   {{ field.field }}
94Index: django/contrib/admin/templates/admin/includes/fieldset.html
95===================================================================
96--- django/contrib/admin/templates/admin/includes/fieldset.html (revision 13020)
97+++ django/contrib/admin/templates/admin/includes/fieldset.html (working copy)
98@@ -1,3 +1,4 @@
99+{% load i18n adminmedia %}
100 <fieldset class="module aligned {{ fieldset.classes }}">
101     {% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %}
102     {% if fieldset.description %}
103@@ -13,7 +14,7 @@
104                     {% else %}
105                         {{ field.label_tag }}
106                         {% if field.is_readonly %}
107-                            <p>{{ field.contents }}</p>
108+                            <p>{{ field.contents }} {% if field.change_url %}<a href="{{ field.change_url }}" class="readonly_field_change_link"><img src="{% admin_media_prefix %}img/admin/icon_changelink.gif" width="10" height="10" alt="{% trans "edit" %}" title="{% trans "edit" %}"/></a>{% endif %}</p>
109                         {% else %}
110                             {{ field.field }}
111                         {% endif %}