Запросите шаблон для переменных, в которых он нуждается?

Если бы Вы работаете со мной, и Вы работаете с Oracle, я, вероятно, заставил бы Вас использовать varchar почти при каждом обстоятельстве. Предположение, что char использование меньше вычислительной мощности, чем varchar может быть верным... на данный момент..., но механизмы базы данных поправляются со временем и этот вид общего правила, имеет создание из будущего "мифа".

Другая вещь: Я никогда не видел проблемы производительности, потому что кто-то решил пойти с varchar. Вы будете намного лучше использовать свое время, пишущий хороший код (меньше вызовов к базе данных) и эффективный SQL (как делают индексную работу, как оптимизатор принимает решения, почему exists быстрее, чем in обычно...).

Последняя мысль: Я видел все виды проблем с использованием CHAR, люди, ищущие, '' когда они должны искать '', или люди, ищущие 'НЕЧТО', когда они должны искать 'НЕЧТО (набор пробелов здесь)', или люди, не обрезающие конечные пробелы или ошибки с Powerbuilder, составляющим в целом 2 000 пробелов к значению, это возвращается из процедуры Oracle.

12
задан Vicki Laidler 4 December 2009 в 18:10
поделиться

1 ответ

Вы можете визуально проверить шаблон и наблюдать наличие любых объектов «Узел переменных» в списке узлов этого шаблона:

>>> from django.template import Template, Context
>>> t = Template("Django is {{ adjective }} and I {{ verb }} it.")
>>> t.nodelist
[<Text Node: 'Django is '>, <Variable Node: adjective>, <Text Node: ' and I '>, <Variable Node: verb>, <Text Node: ' it.'>]

Они имеют тип Узел переменных , это класс, который можно напрямую импортировать для использования в сравнениях. Любой экземпляр Node имеет метод get_nodes_by_type () , который может быть вызван для списка узлов, который возвращает все узлы этого типа для шаблона. Пример:

>>> from django.template import VariableNode
>>> varnodes = t.nodelist.get_nodes_by_type(VariableNode)
>>> varnodes
[<Variable Node: adjective>, <Variable Node: verb>]

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

Само имя переменной хранится в filter_expression. токен для каждого VariableNode :

>>> varnodes[0].filter_expression.token
u'adjective'

Итак, простое понимание списка дает нам все имена переменных для шаблона:

>>> template_vars = [x.filter_expression.token for x in varnodes]
>>> template_vars
[u'adjective', u'verb']

Итак, не самое простое решение, но если есть лучший способ, я не знаю об этом.

Бонус: Функция !!

from django.template import VariableNode
def get_template_vars(t):
   varnodes = t.nodelist.get_nodes_by_type(VariableNode)
   return [x.filter_expression.token for x in varnodes]

Ладно, все не так уж сложно!

Последующее редактирование: получение переменных из родительских шаблонов

(В этом продолжении используется информация из обновленного вопроса).

Здесь действительно все становится сложно, потому что список узлов игрушечного шаблона единственный ExtendsNode (в данном случае).

>>> toy.nodelist
[<ExtendsNode: extends "mysite/toyparent.html">]

Я полагаю, что в более крупных шаблонах может быть несколько объектов ExtendsNode . В любом случае, если вы проверите ExtendsNode и извлечете из него родительский шаблон, вы сможете обращаться с родительским узлом так же, как в моем исходном примере:

>>> enode = toy.nodelist[0]
>>> enode.parent_name
u'mysite/toyparent.html'
>>> parent = enode.get_parent(enode.parent_name)
>>> parent
<django.template.Template object at 0x101c43790>
>>> parent.nodelist.get_nodes_by_type(VariableNode)
[<Variable Node: adjective>]

А есть ваша переменная прилагательное , извлеченная из родительского шаблона. Чтобы выполнить тест для ExtendsNode , вы можете импортировать класс из django.template.loader_tags :

>>> from django.template.loader_tags import ExtendsNode
>>> ext = toy.nodelist.get_nodes_by_type(ExtendsNode)
>>> ext
[<ExtendsNode: extends "mysite/toyparent.html">]

Итак, вы можете выполнить несколько тестов для шаблонов на наличие ] ExtendsNode и возвращаемся к родительскому шаблону и получаем индивидуальные имена этих переменных. Однако это начинает походить на банку с червями.

Например, если бы вы сделали это:

>>> toy.nodelist.get_nodes_by_type((ExtendsNode, VariableNode))
[<ExtendsNode: extends "mysite/toyparent.html">, <Variable Node: block.super>, <Variable Node: verb>]

Теперь у вас есть объекты ExtendsNode и VariableNode , и это просто начинает сбивать с толку. Что нам тогда делать? Пытаемся ли мы игнорировать любые переменные блока , возвращаемые в результате таких тестов? Я не знаю !!

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

20
ответ дан 2 December 2019 в 18:19
поделиться
Другие вопросы по тегам:

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