Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-如果我的模板标记接受了上下文,并且上下文发生了更改,那么它的新变量是否可以在我页面的其余部分访问?_Django_Django Templates_Templatetags - Fatal编程技术网

Django-如果我的模板标记接受了上下文,并且上下文发生了更改,那么它的新变量是否可以在我页面的其余部分访问?

Django-如果我的模板标记接受了上下文,并且上下文发生了更改,那么它的新变量是否可以在我页面的其余部分访问?,django,django-templates,templatetags,Django,Django Templates,Templatetags,我有一个模板标记,它接受上下文。在其中,我向上下文添加了一个变量。似乎这个变量在包含我的模板标签的模板中正确打印(我们称之为“桌面”)。但在包含该模板的模板中,它不再具有变量 if takes_context: if params[0] == 'context': params = params[1:] else: raise TemplateSyntaxError( "'%s' is decorated with take

我有一个模板标记,它接受上下文。在其中,我向上下文添加了一个变量。似乎这个变量在包含我的模板标签的模板中正确打印(我们称之为“桌面”)。但在包含该模板的模板中,它不再具有变量

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)

我在谷歌上搜索了django文档,因为我很好奇这里发生了什么。my template标记的上下文变量是否仅在包含它的模板内可用,而不是超出它的范围?在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)
在class InclusionNode class render函数中,将创建一个新的上下文对象来呈现模板标记的模板:

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上下文传播到调用模板。

据我所知,模板标记的呈现上下文仅适用于它正在呈现的模板。它不会覆盖模板中其他位置使用的上下文变量。您想实现什么?我只是好奇地发现我的变量正在包含include to my templatetag的模板中打印。我本来希望它被限制在,正如你所说的,它呈现的模板。但是没有,看起来是向上走了一步,但没有超越。谢谢Cedric,但根据我给你的现场演示,templatetag上下文仍然可以在templatetag包含的模板中使用(并且仅在包含下,而不是包含系列中的任何更高级别)