diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index c2c4d84..bdce73b 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,7 +40,7 @@ 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.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 @@ -1063,7 +1065,7 @@ class ModelAdmin(BaseModelAdmin): ) msg_dict = { 'name': force_text(opts.verbose_name), - 'obj': force_text('{1}').format(urlquote(obj_url), escape(obj)), + 'obj': format_html('{1}', urlquote(obj_url), obj), } # Here, we distinguish between different save types by checking for # the presence of keys in request.POST. @@ -1081,7 +1083,10 @@ 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, mark_safe(msg), messages.SUCCESS) if post_url_continue is None: post_url_continue = obj_url @@ -1092,14 +1097,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, mark_safe(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, mark_safe(msg), messages.SUCCESS) return self.response_post_save_add(request, obj) @@ -1127,18 +1138,24 @@ class ModelAdmin(BaseModelAdmin): msg_dict = { 'name': force_text(opts.verbose_name), - 'obj': force_text('{1}').format(urlquote(request.path), escape(obj)), + 'obj': format_html('{1}', 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 - self.message_user(request, mark_safe(msg), messages.SUCCESS) + 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 - self.message_user(request, mark_safe(msg), messages.SUCCESS) + 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), args=(pk_value,), @@ -1147,8 +1164,11 @@ 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 - self.message_user(request, mark_safe(msg), messages.SUCCESS) + 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), current_app=self.admin_site.name) @@ -1156,8 +1176,11 @@ class ModelAdmin(BaseModelAdmin): return HttpResponseRedirect(redirect_url) else: - msg = _('The %(name)s "%(obj)s" was changed successfully.') % msg_dict - self.message_user(request, mark_safe(msg), messages.SUCCESS) + 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) def response_post_save_add(self, request, obj):