Django - 如果我的模板标签采用上下文并更改了上下文,那么它的新变量是否可以在我的页面的其余部分中访问?

时间:2015-12-03 22:20:24

标签: django django-templates templatetags

我有一个获取上下文的模板标记。在其中我向我的上下文添加一个变量。看来这个变量在包含我的模板标签的模板中正确打印(让我们称之为"桌面")。但是在包含THAT模板的模板中,它不再具有变量。

我已经搜索了django文档,因为我很好奇这里发生了什么。我的模板标记的上下文变量是否仅在包含它的模板中可用,而不是超出,因为它似乎?

1 个答案:

答案 0 :(得分:2)

在Django库中,django.template.base有 parse_bits 函数。在此函数中,视图上下文将复制到新变量中。

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)

在类 InclusionNode 类渲染函数中,创建了一个新的上下文对象来渲染模板标记的模板:

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)

因此它不应该将templatetag上下文传播到调用模板。