diff --git a/django/template/defaulttags.py b/django/template/defaulttags.py index 08ef976be12..2934f5756e4 100644 --- a/django/template/defaulttags.py +++ b/django/template/defaulttags.py @@ -434,9 +434,12 @@ class URLNode(Node): } view_name = self.view_name.resolve(context) try: - current_app = context.request.resolver_match.namespace + current_app = context.request.current_app except AttributeError: - current_app = None + try: + current_app = context.request.resolver_match.namespace + except AttributeError: + current_app = None # Try to look up the URL. If it fails, raise NoReverseMatch unless the # {% url ... as var %} construct is used, in which case return nothing. url = '' diff --git a/tests/template_tests/syntax_tests/test_url.py b/tests/template_tests/syntax_tests/test_url.py index 689ffc8c084..53b3f255185 100644 --- a/tests/template_tests/syntax_tests/test_url.py +++ b/tests/template_tests/syntax_tests/test_url.py @@ -251,3 +251,23 @@ class UrlTagTests(SimpleTestCase): context = RequestContext(request) output = template.render(context) self.assertEqual(output, '/ns2/named-client/42/') + + @setup({'url-namespace-no-current-app': '{% url "app:named.client" 42 %}'}) + def test_url_namespace_no_current_app(self): + request = RequestFactory().get('/') + request.resolver_match = resolve('/ns1/') + request.current_app = None + template = self.engine.get_template('url-namespace-no-current-app') + context = RequestContext(request) + output = template.render(context) + self.assertEqual(output, '/ns2/named-client/42/') + + @setup({'url-namespace-explicit-current-app': '{% url "app:named.client" 42 %}'}) + def test_url_namespace_explicit_current_app(self): + request = RequestFactory().get('/') + request.resolver_match = resolve('/ns1/') + request.current_app = 'app' + template = self.engine.get_template('url-namespace-explicit-current-app') + context = RequestContext(request) + output = template.render(context) + self.assertEqual(output, '/ns2/named-client/42/')