Index: tests/regressiontests/admin_views/tests.py
===================================================================
--- tests/regressiontests/admin_views/tests.py	(wersja 17428)
+++ tests/regressiontests/admin_views/tests.py	(kopia robocza)
@@ -2337,7 +2337,7 @@
                 post_data, follow=True)
         self.assertEqual(response.status_code, 200)
         # Message should contain non-ugly model name. Instance representation is set by unicode() (ugly)
-        self.assertContains(response, '<li class="info">The paper &quot;Paper_Deferred_author object&quot; was changed successfully.</li>', html=True)
+        self.assertContains(response, '<li class="success">The paper &quot;Paper_Deferred_author object&quot; was changed successfully.</li>', html=True)
 
         # defer() is used in ModelAdmin.queryset()
         cl = CoverLetter.objects.create(author=u"John Doe")
@@ -2352,7 +2352,7 @@
                 post_data, follow=True)
         self.assertEqual(response.status_code, 200)
         # Message should contain non-ugly model name. Instance representation is set by model's __unicode__()
-        self.assertContains(response, '<li class="info">The cover letter &quot;John Doe II&quot; was changed successfully.</li>', html=True)
+        self.assertContains(response, '<li class="success">The cover letter &quot;John Doe II&quot; was changed successfully.</li>', html=True)
 
 class AdminInlineFileUploadTest(TestCase):
     urls = "regressiontests.admin_views.urls"
Index: django/contrib/comments/admin.py
===================================================================
--- django/contrib/comments/admin.py	(wersja 17428)
+++ django/contrib/comments/admin.py	(kopia robocza)
@@ -1,4 +1,4 @@
-from django.contrib import admin
+from django.contrib import admin, messages
 from django.contrib.comments.models import Comment
 from django.utils.translation import ugettext_lazy as _, ungettext
 from django.contrib.comments import get_model
@@ -65,7 +65,7 @@
         msg = ungettext(u'1 comment was successfully %(action)s.',
                         u'%(count)s comments were successfully %(action)s.',
                         n_comments)
-        self.message_user(request, msg % {'count': n_comments, 'action': done_message(n_comments)})
+        self.message_user(request, msg % {'count': n_comments, 'action': done_message(n_comments)}, messages.SUCCESS)
 
 # Only register the default admin if the model is the built-in comment model
 # (this won't be true if there's a custom comment app).
Index: django/contrib/admin/options.py
===================================================================
--- django/contrib/admin/options.py	(wersja 17428)
+++ django/contrib/admin/options.py	(kopia robocza)
@@ -688,12 +688,12 @@
         change_message = ' '.join(change_message)
         return change_message or _('No fields changed.')
 
-    def message_user(self, request, message):
+    def message_user(self, request, message, level=messages.INFO):
         """
         Send a message to the user. The default implementation
         posts a message using the django.contrib.messages backend.
         """
-        messages.info(request, message)
+        messages.add_message(request, level, message)
 
     def save_form(self, request, form, change):
         """
@@ -773,7 +773,7 @@
         # Here, we distinguish between different save types by checking for
         # the presence of keys in request.POST.
         if "_continue" in request.POST:
-            self.message_user(request, msg + ' ' + _("You may edit it again below."))
+            self.message_user(request, msg + ' ' + _("You may edit it again below."), messages.SUCCESS)
             if "_popup" in request.POST:
                 post_url_continue += "?_popup=1"
             return HttpResponseRedirect(post_url_continue % pk_value)
@@ -785,10 +785,10 @@
                 # escape() calls force_unicode.
                 (escape(pk_value), escapejs(obj)))
         elif "_addanother" in request.POST:
-            self.message_user(request, msg + ' ' + (_("You may add another %s below.") % force_unicode(opts.verbose_name)))
+            self.message_user(request, msg + ' ' + (_("You may add another %s below.") % force_unicode(opts.verbose_name)), messages.SUCCESS)
             return HttpResponseRedirect(request.path)
         else:
-            self.message_user(request, msg)
+            self.message_user(request, msg, messages.SUCCESS)
 
             # Figure out where to redirect. If the user has change permission,
             # redirect to the change-list page for this object. Otherwise,
@@ -821,25 +821,25 @@
 
         msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': force_unicode(verbose_name), 'obj': force_unicode(obj)}
         if "_continue" in request.POST:
-            self.message_user(request, msg + ' ' + _("You may edit it again below."))
+            self.message_user(request, msg + ' ' + _("You may edit it again below."), messages.SUCCESS)
             if "_popup" in request.REQUEST:
                 return HttpResponseRedirect(request.path + "?_popup=1")
             else:
                 return HttpResponseRedirect(request.path)
         elif "_saveasnew" in request.POST:
             msg = _('The %(name)s "%(obj)s" was added successfully. You may edit it again below.') % {'name': force_unicode(verbose_name), 'obj': obj}
-            self.message_user(request, msg)
+            self.message_user(request, msg, messages.SUCCESS)
             return HttpResponseRedirect(reverse('admin:%s_%s_change' %
                                         (opts.app_label, module_name),
                                         args=(pk_value,),
                                         current_app=self.admin_site.name))
         elif "_addanother" in request.POST:
-            self.message_user(request, msg + ' ' + (_("You may add another %s below.") % force_unicode(verbose_name)))
+            self.message_user(request, msg + ' ' + (_("You may add another %s below.") % force_unicode(verbose_name)), messages.SUCCESS)
             return HttpResponseRedirect(reverse('admin:%s_%s_add' %
                                         (opts.app_label, module_name),
                                         current_app=self.admin_site.name))
         else:
-            self.message_user(request, msg)
+            self.message_user(request, msg, messages.SUCCESS)
             # Figure out where to redirect. If the user has change permission,
             # redirect to the change-list page for this object. Otherwise,
             # redirect to the admin index.
@@ -898,7 +898,7 @@
                 # Reminder that something needs to be selected or nothing will happen
                 msg = _("Items must be selected in order to perform "
                         "actions on them. No items have been changed.")
-                self.message_user(request, msg)
+                self.message_user(request, msg, messages.ERROR)
                 return None
 
             if not select_across:
@@ -916,7 +916,7 @@
                 return HttpResponseRedirect(request.get_full_path())
         else:
             msg = _("No action selected.")
-            self.message_user(request, msg)
+            self.message_user(request, msg, messages.ERROR)
             return None
 
     @csrf_protect_m
@@ -1158,7 +1158,7 @@
             else:
                 msg = _("Items must be selected in order to perform "
                         "actions on them. No items have been changed.")
-                self.message_user(request, msg)
+                self.message_user(request, msg, messages.ERROR)
                 action_failed = True
 
         # Actions with confirmation
@@ -1203,7 +1203,7 @@
                                     changecount) % {'count': changecount,
                                                     'name': name,
                                                     'obj': force_unicode(obj)}
-                    self.message_user(request, msg)
+                    self.message_user(request, msg, messages.SUCCESS)
 
                 return HttpResponseRedirect(request.get_full_path())
 
@@ -1280,7 +1280,10 @@
             self.log_deletion(request, obj, obj_display)
             self.delete_model(request, obj)
 
-            self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display)})
+            self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % {
+                'name': force_unicode(opts.verbose_name),
+                'obj': force_unicode(obj_display)
+            }, messages.SUCCESS)
 
             if not self.has_change_permission(request, None):
                 return HttpResponseRedirect(reverse('admin:index',
Index: django/contrib/admin/actions.py
===================================================================
--- django/contrib/admin/actions.py	(wersja 17428)
+++ django/contrib/admin/actions.py	(kopia robocza)
@@ -3,6 +3,7 @@
 """
 
 from django.core.exceptions import PermissionDenied
+from django.contrib import messages
 from django.contrib.admin import helpers
 from django.contrib.admin.util import get_deleted_objects, model_ngettext
 from django.db import router
@@ -47,7 +48,7 @@
             queryset.delete()
             modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % {
                 "count": n, "items": model_ngettext(modeladmin.opts, n)
-            })
+            }, messages.SUCCESS)
         # Return None to display the change list page again.
         return None
 
