Django templatetag объем, вынуждающий меня сделать дополнительные запросы

Проблема состоит в том, что, если я называю templatetag в блок и он заполняет меня переменная обычным контекстом [varname] =something, затем если мне нужна та переменная в другой блок, я должен назвать templatetag снова. Это для меня означает дополнительные запросы дб, который является действительно чем-то, чего я стараюсь избегать.

Этот templatetag называют в основном шаблоне, который расширяется многими другими шаблонами, таким образом, я не могу только изменить все представления для передачи чего-то контексту, он не имеет никакого смысла (ВЛАЖНЫЙ принцип?)

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

Я думал о записи templatetag, который будет использовать внутренние структуры контекста для помещения переменной в глобальный контекст, но я чувствовал бы себя слишком виновным, делая его.

Как Вы решили бы эту проблему?

5
задан Alex Rades 16 January 2010 в 10:50
поделиться

3 ответа

Вы также можете реализовать интерфейс OnClickListener в своем классе и избежать необходимости в анонимном внутреннем классе. Затем следует установить прослушиватель on click следующим образом:

findViewEventId (R.id.Button01) .setOnClickListener (this);

Если используется несколько кнопок с одним прослушивателем, можно использовать оператор switch с view.getId () (который соответствует идентификатору представления в R.id), чтобы различить их.

-121--845819-

i используйте компилятор intel. как в Windows, так и в Linux.

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

Если код является вычислительным и содержит много циклов - отчет о векторизации в компиляторе intel очень полезен - ищите «vec-report» в справке.

поэтому основная идея - полировать критический код производительности. что касается остальных - приоритет, чтобы быть правильным и ремонтируемым - короткие функции, четкий код, который может быть понят 1 год спустя.

-121--685209-

Вы сказали: «Этот шаблон вызывается в базовом шаблоне, который расширяется многими другими шаблонами».

Вопрос: вызывается ли этот тэг из именованного блока? Если это так, то у вас есть пара потенциальных проблем.

  1. {% block%} перемещает новый символ в стек Context и выводит его, когда он достигает соответствующего «» {% endblock%} «». Это означает, что любое значение контекста, созданное в блоке, по существу вышло из области при выходе из блока.

  2. Если этот блок переопределен каким-либо другим шаблоном, расширяющим базовый шаблон, значение может быть недоступно, если не будет выполнено {{block.super}} , и даже тогда я не уверен, что это значение будет доступно шаблону, выполняющему расширение.

Если тэг не вызывается из {% block%} , то контекстное значение должно быть доступно для всего следующего за ним кода, либо в базовом шаблоне, либо в любых включенных шаблонах, либо (я думаю) в любых расширенных шаблонах.

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

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

Обновление для комментариев: Хорошо, время принести большие пушки! Один из самых раздражающих, давних багов в Django шаблоны является то, что callables (т. Е. функции), которые являются значениями контекста верхнего уровня (в отличие от функций, которые являются dict-values/methods из значений контекста) не вызываются! Этот билет имеет возраст более 2 лет и содержит около 10 строк кода для исправления. У нас есть несколько тяжелых вызовов БД, которые мы хотим выполнить только , если срок действия кэша шаблона истек . Итак, мы a) MonkeyPatched шаблон _ resolve _ lookup () код для устранения вызываемой проблемы, а затем b)функции карри должны иметь все необходимые параметры при необходимости , так как невозможно передать параметры функциям в шаблоне «language».

3
ответ дан 14 December 2019 в 19:13
поделиться

Я думаю, что вы точно описали ограничения в этой ситуации. Наиболее удобными решениями, скорее всего, будут включать в себя некоторую реструктуризацию вашей цепочки наследования шаблона, хотя его трудно сказать, не зная деталей. Можете ли вы представить новый шаблон в иерархии наследования, вероятно, где-то рядом с верхней частью пирамиды, но так оно только унаследовано шаблонами, которые нуждаются в этих данных, с одним блоком, который охватывает весь регион, в котором вам нужны эти данные? Затем большой блок может быть подразделен на более мелкие блоки, которые наследуют шаблоны, переопределяют. Если вы называете свой TemplateTag в начале этого блока, все блоки внутри него (в том числе в наследственными шаблонами) будут иметь доступ к данным.

Обновление: я не могу много говорить, не увидев свои шаблоны, но введение нового шаблона в середине цепочки наследования очень редко включает в себя «изменение всех шаблонов» в структуре вместо этого наследования, она часто можно сделать с изменениями только к одной или двум другим шаблонам. И я думаю, что я предлагаю на самом деле не взломать, это просто лучший дизайн. Если вам нужен определенные данные в определенных частях вашего сайта, а не другие детали, там должен быть определенным единственным шаблоном, который вы можете указать и сказать «этот шаблон представляет собой логический слой, при котором этот кусок данные вводятся и включают части сайта, где необходимы эти данные ».

2
ответ дан 14 December 2019 в 19:13
поделиться

Вы просто пытаетесь снять количество запросов баз данных или вы ищете умный раствор?

Если это первое, я бы определенно пошел с кэшированием. Фрагмент кэширования работает в вашем случае? Если нет, возможно, вы могли бы поставить кэширование в код тега шаблона (предполагая, что это не одно из собственных тегов Django, используя ваше использование)?

0
ответ дан 14 December 2019 в 19:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: