Как создать расширение jinja2? - PullRequest
2 голосов
/ 05 октября 2009

Я пытаюсь сделать расширение для jinja2. Я написал такой код:

http://dumpz.org/12996/

Но я получаю исключение: 'NoneType' object is not iterable. Где ошибка? Это должно вернуть parse. И что следует принять и вернуть _media?

1 Ответ

11 голосов
/ 25 ноября 2009

Вы используете CallBlock, который указывает, что вы хотите, чтобы ваше расширение действовало как блок. Э.Г.

{% mytest arg1 arg2 %}
stuff
in
here
{% endmytest %}

nodes.CallBlock ожидает, что вы передадите ему список узлов, представляющих тело (внутренние операторы) для вашего расширения. В настоящее время вы передаете None - отсюда и ваша ошибка.

После того, как вы проанализировали свои аргументы, вам нужно приступить к анализу тела блока. К счастью, это легко. Вы можете просто сделать:

body = parser.parse_statements(['name:endmytest'], drop_needle=True)  

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

body = parser.parse_statements(['name:endmytest'], drop_needle=True)  
return nodes.CallBlock(self.call_method('_mytestfunc', args),[], [], body).set_lineno(lineno)

В качестве альтернативы, если вы не хотите, чтобы ваше расширение было тегом блока, например,

{% mytest arg1 arg2 %}

вы не должны использовать nodes.CallBlock, вы должны просто использовать nodes.Call, который не принимает параметр тела. Так что просто сделайте:

return self.call_method('_mytestfunc', args)  

self.call_method - это просто удобная функция-обертка, которая создает для вас узел Call.

Я потратил несколько дней на написание расширений Jinja2, и это сложно. Там не так много документации (кроме кода). GitHub проект гроба имеет несколько примеров расширений здесь .

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