﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
24338	{%extends%}-ing a file-based template object is broken by deprecation path indirection	Julien Hartmann	Aymeric Augustin	"Hello,
I could not find it on the bug tracker, sorry if I just missed it.
I am using git version, commit id bd80fa6b0f7e5a0cc4ea26cedd56d0c4c4894420 on branch stable/1.8.x

Setup:
* load a template in a view using select_template
* insert the result of select_template into the {{{context['foo']}}} of another template, that has {{{{% extends foo %}}}}.
* render that template with that context.

That is:
{{{#!python
# as part of a class-based view
template_name = 'child_template.html'

def get(self, *args, **kwargs):
    context = self.get_context_data()
    context['base_template'] = select_template(['foo.html', 'bar.html'])
    return self.render_to_response(context)
}}}
If child_template.html contains a '''{% extends base_template %}''', the rendering process will break while trying to access the template's nodelist:

{{{
======================================================================
ERROR: test_admin_change_form_title (hvad.tests.admin.NormalAdminTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File ""/home/spectras/Projects/hvad/django-hvad/hvad/tests/admin.py"", line 226, in test_admin_change_form_title
    response = self.client.get(url)
  File ""/home/spectras/Projects/hvad/django/django/test/client.py"", line 499, in get
    **extra)
  File ""/home/spectras/Projects/hvad/django/django/test/client.py"", line 302, in get
    return self.generic('GET', path, secure=secure, **r)
  File ""/home/spectras/Projects/hvad/django/django/test/client.py"", line 378, in generic
    return self.request(**r)
  File ""/home/spectras/Projects/hvad/django/django/test/client.py"", line 465, in request
    six.reraise(*exc_info)
  File ""/home/spectras/Projects/hvad/django/django/utils/six.py"", line 659, in reraise
    raise value
  File ""/home/spectras/Projects/hvad/django/django/core/handlers/base.py"", line 163, in get_response
    response = response.render()
  File ""/home/spectras/Projects/hvad/django/django/template/response.py"", line 158, in render
    self.content = self.rendered_content
  File ""/home/spectras/Projects/hvad/django/django/template/response.py"", line 135, in rendered_content
    content = template.render(context, self._request)
  File ""/home/spectras/Projects/hvad/django/django/template/backends/django.py"", line 83, in render
    return self.template.render(context)
  File ""/home/spectras/Projects/hvad/django/django/template/base.py"", line 211, in render
    return self._render(context)
  File ""/home/spectras/Projects/hvad/django/django/test/utils.py"", line 96, in instrumented_test_render
    return self.nodelist.render(context)
  File ""/home/spectras/Projects/hvad/django/django/template/base.py"", line 905, in render
    bit = self.render_node(node, context)
  File ""/home/spectras/Projects/hvad/django/django/template/debug.py"", line 80, in render_node
    return node.render(context)
  File ""/home/spectras/Projects/hvad/django/django/template/loader_tags.py"", line 118, in render
    for node in compiled_parent.nodelist:
AttributeError: 'Template' object has no attribute 'nodelist'
}}}

It seems the ExtendsNode tries to access template.nodelist directly.

However, the Template object returned by select_template is a django.template.backends.django.Template, that encapsulates the actual template, so it can intercept render() and throw some deprecation warnings.

I guess it just misses a nodelist property that would forward to the actual template's nodelist.

I can build a proper example if absolutely needed, but it seemed simple enough that it would not be necessary."	Bug	closed	Template system	1.8alpha1	Release blocker	fixed	template		Accepted	0	0	0	0	0	0
