Index: django/contrib/admin/options.py
===================================================================
--- django/contrib/admin/options.py	(revision 11784)
+++ django/contrib/admin/options.py	(working copy)
@@ -1,4 +1,4 @@
-from django import forms, template
+from django import forms
 from django.forms.formsets import all_valid
 from django.forms.models import modelform_factory, modelformset_factory, inlineformset_factory
 from django.forms.models import BaseInlineFormSet
@@ -376,6 +376,9 @@
         for inline in self.inline_instances:
             yield inline.get_formset(request, obj)
 
+    def render_to_response(self, request, templates, context):
+        return self.admin_site.render_to_response(request, templates, context)
+
     def log_addition(self, request, object):
         """
         Log that an object has been successfully added.
@@ -584,12 +587,11 @@
             'save_on_top': self.save_on_top,
             'root_path': self.admin_site.root_path,
         })
-        context_instance = template.RequestContext(request, current_app=self.admin_site.name)
-        return render_to_response(self.change_form_template or [
+        return self.render_to_response(request, self.change_form_template or [
             "admin/%s/%s/change_form.html" % (app_label, opts.object_name.lower()),
             "admin/%s/change_form.html" % app_label,
             "admin/change_form.html"
-        ], context, context_instance=context_instance)
+        ], context)
 
     def response_add(self, request, obj, post_url_continue='../%s/'):
         """
@@ -907,7 +909,8 @@
             # the 'invalid=1' parameter was already in the query string, something
             # is screwed up with the database, so display an error page.
             if ERROR_FLAG in request.GET.keys():
-                return render_to_response('admin/invalid_setup.html', {'title': _('Database error')})
+                return self.render_to_response(request,
+                    'admin/invalid_setup.html', {'title': _('Database error')})
             return HttpResponseRedirect(request.path + '?' + ERROR_FLAG + '=1')
 
         # If the request was POSTed, this might be a bulk action or a bulk edit.
@@ -983,12 +986,11 @@
             'actions_on_bottom': self.actions_on_bottom,
         }
         context.update(extra_context or {})
-        context_instance = template.RequestContext(request, current_app=self.admin_site.name)
-        return render_to_response(self.change_list_template or [
+        return self.render_to_response(request, self.change_list_template or [
             'admin/%s/%s/change_list.html' % (app_label, opts.object_name.lower()),
             'admin/%s/change_list.html' % app_label,
             'admin/change_list.html'
-        ], context, context_instance=context_instance)
+        ], context)
 
     @csrf_protect
     def delete_view(self, request, object_id, extra_context=None):
@@ -1040,12 +1042,12 @@
             "app_label": app_label,
         }
         context.update(extra_context or {})
-        context_instance = template.RequestContext(request, current_app=self.admin_site.name)
-        return render_to_response(self.delete_confirmation_template or [
+        return self.render_to_response(request,
+            self.delete_confirmation_template or [
             "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()),
             "admin/%s/delete_confirmation.html" % app_label,
             "admin/delete_confirmation.html"
-        ], context, context_instance=context_instance)
+        ], context)
 
     def history_view(self, request, object_id, extra_context=None):
         "The 'history' admin view for this model."
@@ -1068,12 +1070,11 @@
             'app_label': app_label,
         }
         context.update(extra_context or {})
-        context_instance = template.RequestContext(request, current_app=self.admin_site.name)
-        return render_to_response(self.object_history_template or [
+        return self.render_to_response(request, self.object_history_template or [
             "admin/%s/%s/object_history.html" % (app_label, opts.object_name.lower()),
             "admin/%s/object_history.html" % app_label,
             "admin/object_history.html"
-        ], context, context_instance=context_instance)
+        ], context)
 
     #
     # DEPRECATED methods.
Index: django/contrib/admin/sites.py
===================================================================
--- django/contrib/admin/sites.py	(revision 11784)
+++ django/contrib/admin/sites.py	(working copy)
@@ -1,5 +1,5 @@
 import re
-from django import http, template
+from django import http
 from django.contrib.admin import ModelAdmin
 from django.contrib.admin import actions
 from django.contrib.auth import authenticate, login
@@ -8,6 +8,7 @@
 from django.core.exceptions import ImproperlyConfigured
 from django.core.urlresolvers import reverse
 from django.shortcuts import render_to_response
+from django.template import RequestContext
 from django.utils.functional import update_wrapper
 from django.utils.safestring import mark_safe
 from django.utils.text import capfirst
@@ -270,6 +271,11 @@
             from django.views.i18n import null_javascript_catalog as javascript_catalog
         return javascript_catalog(request, packages='django.conf')
 
+    def render_to_response(self, request, templates, context):
+        context_instance = RequestContext(request, current_app=self.name)
+        return render_to_response(templates, context,
+                                  context_instance=context_instance)
+
     def logout(self, request):
         """
         Logs out the user for the given HttpRequest.
@@ -376,10 +382,8 @@
             'root_path': self.root_path,
         }
         context.update(extra_context or {})
-        context_instance = template.RequestContext(request, current_app=self.name)
-        return render_to_response(self.index_template or 'admin/index.html', context,
-            context_instance=context_instance
-        )
+        return self.render_to_response(request,
+            self.index_template or 'admin/index.html', context)
     index = never_cache(index)
 
     def display_login_form(self, request, error_message='', extra_context=None):
@@ -391,10 +395,8 @@
             'root_path': self.root_path,
         }
         context.update(extra_context or {})
-        context_instance = template.RequestContext(request, current_app=self.name)
-        return render_to_response(self.login_template or 'admin/login.html', context,
-            context_instance=context_instance
-        )
+        return self.render_to_response(request,
+            self.login_template or 'admin/login.html', context)
 
     def app_index(self, request, app_label, extra_context=None):
         user = request.user
@@ -435,11 +437,9 @@
             'root_path': self.root_path,
         }
         context.update(extra_context or {})
-        context_instance = template.RequestContext(request, current_app=self.name)
-        return render_to_response(self.app_index_template or ('admin/%s/app_index.html' % app_label,
-            'admin/app_index.html'), context,
-            context_instance=context_instance
-        )
+        return self.render_to_response(request,
+            self.app_index_template or ('admin/%s/app_index.html' % app_label,
+            'admin/app_index.html'), context)
 
     def root(self, request, url):
         """
Index: docs/ref/contrib/admin/index.txt
===================================================================
--- docs/ref/contrib/admin/index.txt	(revision 11784)
+++ docs/ref/contrib/admin/index.txt	(working copy)
@@ -820,6 +820,15 @@
 This uses the ``HttpRequest`` instance to filter the ``Car`` foreign key field
 to only the cars owned by the ``User`` instance.
 
+.. method:: ModelAdmin.render_to_response(self, request, templates, context)
+
+.. versionadded:: 1.2
+
+The ``render_to_response`` method on a ``ModelAdmin`` invokes the
+:meth:`AdminSite.render_to_response` method on its site. Overriding it at the
+model level allows for the use of external templating languages, or injecting
+variables into the context.
+
 Other methods
 ~~~~~~~~~~~~~
 
@@ -1423,8 +1432,28 @@
     admin template, should provide the ``current_app`` argument to
     ``RequestContext`` or ``Context`` when rendering the template.  It should
     be set to either ``self.name`` if your view is on an ``AdminSite`` or
-    ``self.admin_site.name`` if your view is on a ``ModelAdmin``.
+    ``self.admin_site.name`` if your view is on a ``ModelAdmin``. This is taken
+    care of for you if you use :meth:`AdminSite.render_to_response`.
 
+Overriding template rendering
+-----------------------------
+
+.. method:: AdminSite.render_to_response(self, request, templates, context)
+
+.. versionadded:: 1.2
+
+This method is used to render templates from within the admin views. By default,
+it merely creates a :class:`~django.template.RequestContext` instance and
+invokes :func:`~django.shortcuts.render_to_response`. It can be overridden, for
+example, to add variables to the context of all the site's templates, or to
+use an external template language instead of Django's.
+
+The ``request`` argument is the :class:`~django.http.HttpRequest` for the view
+requesting that the template be rendered. ``templates`` is either a string
+representing a single template to render, or an iterable of strings. For the
+latter, the first template in the iterable that exists is used. ``context`` is
+a simple Python dictionary to be used as the template's context.
+
 .. _admin-reverse-urls:
 
 Reversing Admin URLs
