Ticket #13165: change_links.diff

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

Draft patch. No tests yet.

  • django/contrib/admin/helpers.py

     
    1212from django.utils.html import escape, conditional_escape
    1313from django.utils.safestring import mark_safe
    1414from django.utils.translation import ugettext_lazy as _
     15from django.core.urlresolvers import reverse, NoReverseMatch
    1516
    16 
    1717ACTION_CHECKBOX_NAME = '_selected_action'
    1818
    1919class ActionForm(forms.Form):
     
    186186                    result_repr = display_for_field(value, f)
    187187        return conditional_escape(result_repr)
    188188
     189    def change_url(self):
     190        """ Return admin change URL for field if applicable. """
     191        field, obj, model_admin = \
     192            self.field['field'], self.form.instance, self.model_admin
     193        try:
     194            f, attr, value = lookup_field(field, obj, model_admin)
     195        except (AttributeError, ValueError, ObjectDoesNotExist):
     196            return None
     197        else:
     198            rel = getattr(f,'rel')
     199            if rel and rel.to in model_admin.admin_site._registry:
     200                try:
     201                    return reverse('admin:%s_%s_change' % (
     202                            rel.to._meta.app_label,
     203                            rel.to._meta.object_name.lower()),
     204                                   args=(value.pk,),
     205                                   current_app=model_admin.admin_site.name)
     206                except NoReverseMatch:
     207                    return None # fail silently
     208            else:
     209                return None # not a related field
     210
     211   
    189212class InlineAdminFormSet(object):
    190213    """
    191214    A wrapper around an inline formset for use in the admin system.
  • django/contrib/admin/widgets.py

     
    242242            output.append(u'<a href="%s" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' % \
    243243                (related_url, name))
    244244            output.append(u'<img src="%simg/admin/icon_addlink.gif" width="10" height="10" alt="%s"/></a>' % (settings.ADMIN_MEDIA_PREFIX, _('Add Another')))
     245
     246            if value: # (a related object is selected)
     247                try:
     248                    related_object = rel_to.objects.get(pk=value)
     249                except:
     250                    # probably a TypeError (e.g. value is list for
     251                    # multiple-select widgets), but fail silently regardless
     252                    pass
     253                else:
     254                    try:
     255                        change_related_url = reverse(
     256                            'admin:%s_%s_change' % info,
     257                            args=(related_object.id,),
     258                            current_app=self.admin_site.name)
     259                    except NoReverseMatch:
     260                        # fail silently
     261                        pass
     262                    else:
     263                        params = {
     264                            'url': change_related_url,
     265                            'admin_media_prefix': settings.ADMIN_MEDIA_PREFIX,
     266                            'text': _('edit %s' % related_object),
     267                            }
     268                        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)
     269               
    245270        return mark_safe(u''.join(output))
    246271
    247272    def build_attrs(self, extra_attrs=None, **kwargs):
  • django/contrib/admin/templates/admin/edit_inline/tabular.html

     
    4445            {% for field in line %}
    4546              <td class="{{ field.field.name }}">
    4647              {% if field.is_readonly %}
    47                   <p>{{ field.contents }}</p>
     48                  <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>
    4849              {% else %}
    4950                  {{ field.field.errors.as_ul }}
    5051                  {{ field.field }}
  • django/contrib/admin/templates/admin/includes/fieldset.html

     
     1{% load i18n adminmedia %}
    12<fieldset class="module aligned {{ fieldset.classes }}">
    23    {% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %}
    34    {% if fieldset.description %}
     
    1314                    {% else %}
    1415                        {{ field.label_tag }}
    1516                        {% if field.is_readonly %}
    16                             <p>{{ field.contents }}</p>
     17                            <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>
    1718                        {% else %}
    1819                            {{ field.field }}
    1920                        {% endif %}
Back to Top