Django:如何避免在包含标记中污染父上下文?

Django:如何避免在包含标记中污染父上下文?,django,django-templates,Django,Django Templates,以下是我正在努力实现的代码: from django import template from copy import copy register = template.Library() # Renders the site header. @register.inclusion_tag('site/tags/header.tpl', takes_context=True) def header(context): # Load up the URL to a certain pag

以下是我正在努力实现的代码:

from django import template
from copy import copy
register = template.Library()

# Renders the site header.
@register.inclusion_tag('site/tags/header.tpl', takes_context=True)
def header(context):
    # Load up the URL to a certain page.
    url = Page.objects.get(slug='certain-page').url

    # Pass the entire context from our parent into our own template, without polluting
    # our parent's context with our own variables.
    new_context = copy(context)
    new_context['page_url'] = url
    return new_context
不幸的是,这仍然会污染调用此包含标记的模板的上下文

<div id="content">
  {% header %}
  HERE'S THE URL: {{ page_url }}
</div>

{%header%}
这是URL:{{page_URL}}
page\u url
仍将在“HERE'S The url:”之后呈现,因为父上下文已被污染


如何避免这种情况,同时仍然能够使用新变量将完整的父上下文传递到我的模板中?

我认为您需要这样的内容:

new_context = {'page_url': url}
new_context.update(context)
return new_context

希望这有助于

在更新现有上下文之前,
将其推送到堆栈上。使用修改过的上下文呈现模板后,
pop()
it将恢复以前的值


这是有据可查的。

这几乎奏效了!我唯一要做的就是调用context对象上的
flant()
,因为它是
RequestContext
。尽管这些功能类似于字典,但它们显然无法传递给
dict.update()
flant()
将RequestContext减少为实际的dict。正确,我相信这适用于所有
Context
子类。然而,我建议你只通过你需要的。如果您不打算在模板中全部使用变量,则无需复制这些变量!:)