Вы сказали: «Этот тег шаблона вызывается в базовом шаблоне, который расширяется многими другими шаблонами».
Вопрос: этот тег вызывается из названного блока? Если это так, у вас есть пара потенциальных проблем.
{% block %}
помещает новый запрос в стек контекста и выскакивает его, когда он достигает соответствующего значения {{end endblock%} '. Это означает, что любое значение контекста, созданное в то время как в блоке, по существу вышло из области видимости при выходе из блока.
Если этот блок переопределен каким-либо другим шаблоном, который расширяет базовый шаблон, значение может быть недоступно вообще, если вы не сделаете {{block.super}}
, и даже тогда я не уверен, что значение будет доступно шаблону, выполняющему расширение.
Если тег не вызывается изнутри {% block %}
, тогда значение контекста должно быть доступно для всего кода, который следует за ним, либо в базовом шаблоне, любых включенных шаблонах и (я думаю, ) любые расширяющиеся шаблоны.
Это один из тех случаев, когда создание набора тщательных тестов, вероятно, сэкономит ваше время и слезы.
В качестве альтернативы, если вы всегда обращаетесь к этому значению, вы можете просто поместить его в контекстный процессор , чтобы гарантировать его доступность.
Обновление для комментариев: ОК, время вводить большие пушки! Одна из наиболее раздражающих, давних ошибок в шаблонах Django заключается в том, что вызываемые объекты (т.е. функции) являются значениями контекста верхнего уровня (в отличие от функций, которые являются значениями / методами dict из значений контекста) не называются! Этот билет старше 2 лет, и для его исправления требуется около 10 строк кода. У нас есть несколько тяжеловесных вызовов БД, которые мы хотим сделать только , если кэш шаблона истек . Таким образом, мы а) MonkeyPatched шаблон _resolve_lookup()
код, чтобы исправить вызываемую проблему, а затем б) функции карри, чтобы иметь все необходимые параметры при необходимости , потому что вы не можете передавать параметры в функции в шаблон "язык".