[Answered ]-Django – If my template tag takes the context and the context is changed, are its new variables accessible in the rest of my page?

2πŸ‘

In the Django library, django.template.base you have the parse_bits function. In this function, the view context is copied into a new variable.

if takes_context:
    if params[0] == 'context':
        params = params[1:]
    else:
        raise TemplateSyntaxError(
            "'%s' is decorated with takes_context=True so it must "
            "have a first argument of 'context'" % name)

And in the class InclusionNode class render function, a new context object is created to render the template of the template tag:

class InclusionNode(TagHelperNode):

            def render(self, context):
                """
                Renders the specified template and context. Caches the
                template object in render_context to avoid reparsing and
                loading when used in a for loop.
                """
                resolved_args, resolved_kwargs = self.get_resolved_arguments(context)
                _dict = func(*resolved_args, **resolved_kwargs)

                t = context.render_context.get(self)
                if t is None:
                    if isinstance(file_name, Template):
                        t = file_name
                    elif isinstance(getattr(file_name, 'template', None), Template):
                        t = file_name.template
                    elif not isinstance(file_name, six.string_types) and is_iterable(file_name):
                        t = context.template.engine.select_template(file_name)
                    else:
                        t = context.template.engine.get_template(file_name)
                    context.render_context[self] = t
                new_context = context.new(_dict)
                # Copy across the CSRF token, if present, because
                # inclusion tags are often used for forms, and we need
                # instructions for using CSRF protection to be as simple
                # as possible.
                csrf_token = context.get('csrf_token', None)
                if csrf_token is not None:
                    new_context['csrf_token'] = csrf_token
                return t.render(new_context)

So it should not propagate the templatetag context to the calling template.

πŸ‘€Cedric Roy

Leave a comment