summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJannis Leidel <jannis@leidel.info>2011-01-05 22:41:43 +0000
committerJannis Leidel <jannis@leidel.info>2011-01-05 22:41:43 +0000
commita3894945b647c3e07acdd35af1104739a93938a2 (patch)
tree55f4ca8ef2f69e9d8bbccae6eaa2474e939c86f6
parent093009bf1f37543d4917f495159c4df97b788700 (diff)
Fixed #15010 -- Added current_app parameter to close gap between TemplateResponse and render method. Thanks, acdha.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@15153 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--AUTHORS1
-rw-r--r--django/shortcuts/__init__.py13
-rw-r--r--django/template/response.py7
-rw-r--r--docs/ref/template-response.txt7
-rw-r--r--docs/topics/http/shortcuts.txt9
-rw-r--r--tests/regressiontests/templates/response.py7
-rw-r--r--tests/regressiontests/views/tests/shortcuts.py8
-rw-r--r--tests/regressiontests/views/urls.py3
-rw-r--r--tests/regressiontests/views/views.py14
9 files changed, 62 insertions, 7 deletions
diff --git a/AUTHORS b/AUTHORS
index d7601ca45a..ffcc34d5dd 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -33,6 +33,7 @@ people who have submitted patches, reported bugs, added translations, helped
answer newbie questions, and generally made Django that much better:
Gisle Aas <gisle@aas.no>
+ Chris Adams
ajs <adi@sieker.info>
alang@bright-green.com
A S Alam <aalam@users.sf.net>
diff --git a/django/shortcuts/__init__.py b/django/shortcuts/__init__.py
index b7d69b5b0c..9f97cae955 100644
--- a/django/shortcuts/__init__.py
+++ b/django/shortcuts/__init__.py
@@ -29,7 +29,18 @@ def render(request, *args, **kwargs):
'content_type': kwargs.pop('content_type', None),
'status': kwargs.pop('status', None),
}
- kwargs['context_instance'] = kwargs.get('context_instance', RequestContext(request))
+
+ if 'context_instance' in kwargs:
+ context_instance = kwargs.pop('context_instance')
+ if kwargs.get('current_app', None):
+ raise ValueError('If you provide a context_instance you must '
+ 'set its current_app before calling render()')
+ else:
+ current_app = kwargs.pop('current_app', None)
+ context_instance = RequestContext(request, current_app=current_app)
+
+ kwargs['context_instance'] = context_instance
+
return HttpResponse(loader.render_to_string(*args, **kwargs),
**httpresponse_kwargs)
diff --git a/django/template/response.py b/django/template/response.py
index d89fee0aab..629461aa5e 100644
--- a/django/template/response.py
+++ b/django/template/response.py
@@ -90,11 +90,14 @@ class SimpleTemplateResponse(HttpResponse):
class TemplateResponse(SimpleTemplateResponse):
def __init__(self, request, template, context=None, mimetype=None,
- status=None, content_type=None):
+ status=None, content_type=None, current_app=None):
# self.request gets over-written by django.test.client.Client - and
# unlike context_data and template_name the _request should not
# be considered part of the public API.
self._request = request
+ # As a convenience we'll allow callers to provide current_app without
+ # having to avoid needing to create the RequestContext directly
+ self._current_app = current_app
super(TemplateResponse, self).__init__(
template, context, mimetype, status, content_type)
@@ -105,4 +108,4 @@ class TemplateResponse(SimpleTemplateResponse):
if isinstance(context, Context):
return context
else:
- return RequestContext(self._request, context)
+ return RequestContext(self._request, context, current_app=self._current_app)
diff --git a/docs/ref/template-response.txt b/docs/ref/template-response.txt
index 3b136b68b1..d4fe2c4ef2 100644
--- a/docs/ref/template-response.txt
+++ b/docs/ref/template-response.txt
@@ -129,7 +129,7 @@ TemplateResponse objects
Methods
-------
-.. method:: TemplateResponse.__init__(request, template, context=None, mimetype=None, status=None, content_type=None)
+.. method:: TemplateResponse.__init__(request, template, context=None, mimetype=None, status=None, content_type=None, current_app=None)
Instantiates an ``TemplateResponse`` object with the given
template, context, MIME type and HTTP status.
@@ -158,6 +158,11 @@ Methods
``content_type`` is used. If neither is given,
:setting:`DEFAULT_CONTENT_TYPE` is used.
+ ``current_app``
+ A hint indicating which application contains the current view. See the
+ :ref:`namespaced URL resolution strategy <topics-http-reversing-url-namespaces>`
+ for more information.
+
The rendering process
=====================
diff --git a/docs/topics/http/shortcuts.txt b/docs/topics/http/shortcuts.txt
index 1c1dc9ef0b..9d72521c0f 100644
--- a/docs/topics/http/shortcuts.txt
+++ b/docs/topics/http/shortcuts.txt
@@ -15,7 +15,7 @@ introduce controlled coupling for convenience's sake.
``render``
==========
-.. function:: render(request, template[, dictionary][, context_instance][, content_type][, status])
+.. function:: render(request, template[, dictionary][, context_instance][, content_type][, status][, current_app])
.. versionadded:: 1.3
@@ -23,7 +23,7 @@ introduce controlled coupling for convenience's sake.
:class:`~django.http.HttpResponse` object with that rendered text.
:func:`render()` is the same as a call to
- :func:`render_to_response()` with a context_instance argument that
+ :func:`render_to_response()` with a `context_instance` argument that
that forces the use of a :class:`RequestContext`.
Required arguments
@@ -55,6 +55,11 @@ Optional arguments
``status``
The status code for the response. Defaults to ``200``.
+``current_app``
+ A hint indicating which application contains the current view. See the
+ :ref:`namespaced URL resolution strategy <topics-http-reversing-url-namespaces>`
+ for more information.
+
Example
-------
diff --git a/tests/regressiontests/templates/response.py b/tests/regressiontests/templates/response.py
index 8bdf7f4196..2f0d2c7822 100644
--- a/tests/regressiontests/templates/response.py
+++ b/tests/regressiontests/templates/response.py
@@ -172,3 +172,10 @@ class TemplateResponseTest(BaseTemplateResponseTest):
'application/json', 504)
self.assertEqual(response['content-type'], 'application/json')
self.assertEqual(response.status_code, 504)
+
+ def test_custom_app(self):
+ response = self._response('{{ foo }}', current_app="foobar")
+
+ rc = response.resolve_context(response.context_data)
+
+ self.assertEqual(rc.current_app, 'foobar')
diff --git a/tests/regressiontests/views/tests/shortcuts.py b/tests/regressiontests/views/tests/shortcuts.py
index 3f260fee10..c5f664e806 100644
--- a/tests/regressiontests/views/tests/shortcuts.py
+++ b/tests/regressiontests/views/tests/shortcuts.py
@@ -38,6 +38,7 @@ class ShortcutTests(TestCase):
self.assertEquals(response.status_code, 200)
self.assertEquals(response.content, 'FOO.BAR../path/to/static/media\n')
self.assertEquals(response['Content-Type'], 'text/html; charset=utf-8')
+ self.assertEquals(response.context.current_app, None)
def test_render_with_base_context(self):
response = self.client.get('/views/shortcuts/render/base_context/')
@@ -56,3 +57,10 @@ class ShortcutTests(TestCase):
self.assertEquals(response.status_code, 403)
self.assertEquals(response.content, 'FOO.BAR../path/to/static/media\n')
+ def test_render_with_current_app(self):
+ response = self.client.get('/views/shortcuts/render/current_app/')
+ self.assertEquals(response.context.current_app, "foobar_app")
+
+ def test_render_with_current_app_conflict(self):
+ self.assertRaises(ValueError, self.client.get, '/views/shortcuts/render/current_app_conflict/')
+
diff --git a/tests/regressiontests/views/urls.py b/tests/regressiontests/views/urls.py
index 7cba5f647d..a170efb1fc 100644
--- a/tests/regressiontests/views/urls.py
+++ b/tests/regressiontests/views/urls.py
@@ -151,7 +151,8 @@ urlpatterns += patterns('regressiontests.views.views',
(r'^shortcuts/render/base_context/$', 'render_view_with_base_context'),
(r'^shortcuts/render/content_type/$', 'render_view_with_content_type'),
(r'^shortcuts/render/status/$', 'render_view_with_status'),
-
+ (r'^shortcuts/render/current_app/$', 'render_view_with_current_app'),
+ (r'^shortcuts/render/current_app_conflict/$', 'render_view_with_current_app_conflict'),
)
# simple generic views.
diff --git a/tests/regressiontests/views/views.py b/tests/regressiontests/views/views.py
index ec017bd7fd..e4e7c3d4e4 100644
--- a/tests/regressiontests/views/views.py
+++ b/tests/regressiontests/views/views.py
@@ -101,3 +101,17 @@ def render_view_with_status(request):
'foo': 'FOO',
'bar': 'BAR',
}, status=403)
+
+def render_view_with_current_app(request):
+ return render(request, 'debug/render_test.html', {
+ 'foo': 'FOO',
+ 'bar': 'BAR',
+ }, current_app="foobar_app")
+
+def render_view_with_current_app_conflict(request):
+ # This should fail because we don't passing both a current_app and
+ # context_instance:
+ return render(request, 'debug/render_test.html', {
+ 'foo': 'FOO',
+ 'bar': 'BAR',
+ }, current_app="foobar_app", context_instance=RequestContext(request))