Вы используете 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 проект гроба имеет несколько примеров расширений здесь .