-
Например, делаю так:
@register.inclusion_tag("template.html", takes_context=True)
def my_inclusion_tag(context):
context["my_new_var"] = "some value"
return {}
В результате контекст не изменяется. Такое впечатление, что передается копия, хотя по исходникам инклюжн_тега такого не видно. Подчеркну, что хочу изменить контекст не для шаблона самого тега (template.html), а для шаблона, с которого он вызван.
В документации по этому поводу ничего не нашел. Знаю, что контекст можно изменить обычным тегом, но хотелось бы убить два зайца одним выстрелом.
Подскажите где я не прав? -
Только что наткнулся на интересную особенность.
Если изменить контекст для одного блока ({% block name %}...{% endblock %}), то в другом изменения невидимы.
Возможно по этому у меня контекст "не изменялся"... так как теги в разных блоках. -
Это от того, что контекст — стековая конструкция. Тег может сказать контексту
push, и в нем создастся новый уровень данных, в который будут записываться все переменные. По выходу из тега тот обычно говоритpop, и весь уровень со всеми новыми переменными в нем пропадает. Так, например, делает{% for %}, который внутри себя делает доступными всякие{{ forloop.counter }}сотоварищи. Насколько я понимаю, разные блоки тоже работают в своих уровнях стека, поэтому изменения в одном не видны в другом.Обмануть его можно, потому что все это открыто, и можно явно дописать значение в самый низ стека, чтобы оно было видно всем:
context.dicts[-1]['key'] = 'value'Но я бы сказал, что надо иметь очень серьезные причины, чтобы делать такую неочевидную вещь...

