diff options
| author | Anton Baklanov <antonbaklanov@gmail.com> | 2015-09-07 12:51:03 +0300 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2015-11-19 15:04:32 -0500 |
| commit | 80bcbecd4a394f67c1679b077ba79a797c4a57d7 (patch) | |
| tree | c3d913684d08517fc2e2ba2de867ee3afaa25592 /django | |
| parent | 1e7da99ea6a78c47d3b5d4e9ce82df1ee4024ada (diff) | |
Fixed #19361 -- Added link to object's change form in admin's post-save message.
Thanks Roel Kramer for tests.
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/admin/options.py | 66 |
1 files changed, 51 insertions, 15 deletions
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index c7ac2ff74f..f6ed33b5ee 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -1,3 +1,5 @@ +from __future__ import unicode_literals + import copy import operator from collections import OrderedDict @@ -38,8 +40,8 @@ from django.template.response import SimpleTemplateResponse, TemplateResponse from django.utils import six from django.utils.decorators import method_decorator from django.utils.encoding import force_text, python_2_unicode_compatible -from django.utils.html import escape, escapejs -from django.utils.http import urlencode +from django.utils.html import escape, escapejs, format_html +from django.utils.http import urlencode, urlquote from django.utils.safestring import mark_safe from django.utils.text import capfirst, get_text_list from django.utils.translation import string_concat, ugettext as _, ungettext @@ -1058,7 +1060,20 @@ class ModelAdmin(BaseModelAdmin): opts = obj._meta pk_value = obj._get_pk_val() preserved_filters = self.get_preserved_filters(request) - msg_dict = {'name': force_text(opts.verbose_name), 'obj': force_text(obj)} + obj_url = reverse( + 'admin:%s_%s_change' % (opts.app_label, opts.model_name), + args=(quote(pk_value),), + current_app=self.admin_site.name, + ) + # Add a link to the object's change form if the user can edit the obj. + if self.has_change_permission(request, obj): + obj_repr = format_html('<a href="{}">{}</a>', urlquote(obj_url), obj) + else: + obj_repr = force_text(obj) + msg_dict = { + 'name': force_text(opts.verbose_name), + 'obj': obj_repr, + } # Here, we distinguish between different save types by checking for # the presence of keys in request.POST. @@ -1075,13 +1090,13 @@ class ModelAdmin(BaseModelAdmin): }) elif "_continue" in request.POST: - msg = _('The %(name)s "%(obj)s" was added successfully. You may edit it again below.') % msg_dict + msg = format_html( + _('The {name} "{obj}" was added successfully. You may edit it again below.'), + **msg_dict + ) self.message_user(request, msg, messages.SUCCESS) if post_url_continue is None: - post_url_continue = reverse('admin:%s_%s_change' % - (opts.app_label, opts.model_name), - args=(quote(pk_value),), - current_app=self.admin_site.name) + post_url_continue = obj_url post_url_continue = add_preserved_filters( {'preserved_filters': preserved_filters, 'opts': opts}, post_url_continue @@ -1089,14 +1104,20 @@ class ModelAdmin(BaseModelAdmin): return HttpResponseRedirect(post_url_continue) elif "_addanother" in request.POST: - msg = _('The %(name)s "%(obj)s" was added successfully. You may add another %(name)s below.') % msg_dict + msg = format_html( + _('The {name} "{obj}" was added successfully. You may add another {name} below.'), + **msg_dict + ) self.message_user(request, msg, messages.SUCCESS) redirect_url = request.path redirect_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, redirect_url) return HttpResponseRedirect(redirect_url) else: - msg = _('The %(name)s "%(obj)s" was added successfully.') % msg_dict + msg = format_html( + _('The {name} "{obj}" was added successfully.'), + **msg_dict + ) self.message_user(request, msg, messages.SUCCESS) return self.response_post_save_add(request, obj) @@ -1122,16 +1143,25 @@ class ModelAdmin(BaseModelAdmin): pk_value = obj._get_pk_val() preserved_filters = self.get_preserved_filters(request) - msg_dict = {'name': force_text(opts.verbose_name), 'obj': force_text(obj)} + msg_dict = { + 'name': force_text(opts.verbose_name), + 'obj': format_html('<a href="{}">{}</a>', urlquote(request.path), obj), + } if "_continue" in request.POST: - msg = _('The %(name)s "%(obj)s" was changed successfully. You may edit it again below.') % msg_dict + msg = format_html( + _('The {name} "{obj}" was changed successfully. You may edit it again below.'), + **msg_dict + ) self.message_user(request, msg, messages.SUCCESS) redirect_url = request.path redirect_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, redirect_url) return HttpResponseRedirect(redirect_url) elif "_saveasnew" in request.POST: - msg = _('The %(name)s "%(obj)s" was added successfully. You may edit it again below.') % msg_dict + msg = format_html( + _('The {name} "{obj}" was added successfully. You may edit it again below.'), + **msg_dict + ) self.message_user(request, msg, messages.SUCCESS) redirect_url = reverse('admin:%s_%s_change' % (opts.app_label, opts.model_name), @@ -1141,7 +1171,10 @@ class ModelAdmin(BaseModelAdmin): return HttpResponseRedirect(redirect_url) elif "_addanother" in request.POST: - msg = _('The %(name)s "%(obj)s" was changed successfully. You may add another %(name)s below.') % msg_dict + msg = format_html( + _('The {name} "{obj}" was changed successfully. You may add another {name} below.'), + **msg_dict + ) self.message_user(request, msg, messages.SUCCESS) redirect_url = reverse('admin:%s_%s_add' % (opts.app_label, opts.model_name), @@ -1150,7 +1183,10 @@ class ModelAdmin(BaseModelAdmin): return HttpResponseRedirect(redirect_url) else: - msg = _('The %(name)s "%(obj)s" was changed successfully.') % msg_dict + msg = format_html( + _('The {name} "{obj}" was changed successfully.'), + **msg_dict + ) self.message_user(request, msg, messages.SUCCESS) return self.response_post_save_change(request, obj) |
