1. Nazar Leush

    02.10.2008 03:17

    Например, делаю так:

    @register.inclusion_tag("template.html", takes_context=True)
    def my_inclusion_tag(context):
    context["my_new_var"] = "some value"
    return {}

    В результате контекст не изменяется. Такое впечатление, что передается копия, хотя по исходникам инклюжн_тега такого не видно. Подчеркну, что хочу изменить контекст не для шаблона самого тега (template.html), а для шаблона, с которого он вызван.

    В документации по этому поводу ничего не нашел. Знаю, что контекст можно изменить обычным тегом, но хотелось бы убить два зайца одним выстрелом.

    Подскажите где я не прав?
  2. Nazar Leush

    02.10.2008 03:31

    Только что наткнулся на интересную особенность.

    Если изменить контекст для одного блока ({% block name %}...{% endblock %}), то в другом изменения невидимы.

    Возможно по этому у меня контекст "не изменялся"... так как теги в разных блоках.
  3. Иван Сагалаев

    02.10.2008 10:32

    Это от того, что контекст — стековая конструкция. Тег может сказать контексту push, и в нем создастся новый уровень данных, в который будут записываться все переменные. По выходу из тега тот обычно говорит pop, и весь уровень со всеми новыми переменными в нем пропадает. Так, например, делает {% for %}, который внутри себя делает доступными всякие {{ forloop.counter }} сотоварищи. Насколько я понимаю, разные блоки тоже работают в своих уровнях стека, поэтому изменения в одном не видны в другом.

    Обмануть его можно, потому что все это открыто, и можно явно дописать значение в самый низ стека, чтобы оно было видно всем:

    context.dicts[-1]['key'] = 'value'
    

    Но я бы сказал, что надо иметь очень серьезные причины, чтобы делать такую неочевидную вещь...

bbcode