I have been trying to create a Jinja2 extension for several hours, and it seems like I'm definitely stuck on one specific point: passing list arguments to a node call. I tried to get inspired by some other working extensions, and I donβt understand why my things do not work while my link code is doing.
Basically, I want things like this in my templates:
{% usebundle "common", "treeview" %}
This should add the lines "common" and "treeview" to some list in context.
Here are the key parts of my code:
class MyExtension(Extension): def __init__(self, environment): super(MyExtension, self).__init__(environment) def parse(self, parser): lineno = parser.stream.next().lineno names = [] while parser.stream.current.type != 'block_end': names.append(parser.parse_expression()) parser.stream.skip_if('comma')
I tried a few things, but what makes me say that the problem is really in the parameter format (the contents of my names value in the parsing function) is that if I replaced nodes.List(names) with nodes.Const(42) , I get the correct value of 42 in the callback parameter.
[EDIT] Error information for this version of code:
Exception on /login [GET] Traceback (most recent call last): File "E:\Python27\lib\site-packages\flask-0.9-py2.7.egg\flask\app.py", line 1687, in wsgi_app response = self.full_dispatch_request() File "E:\Python27\lib\site-packages\flask-0.9-py2.7.egg\flask\app.py", line 1360, in full_dispatch_request rv = self.handle_user_exception(e) File "E:\Python27\lib\site-packages\flask-0.9-py2.7.egg\flask\app.py", line 1358, in full_dispatch_request rv = self.dispatch_request() File "E:\Python27\lib\site-packages\flask-0.9-py2.7.egg\flask\app.py", line 1344, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "E:\myapplication\user.py", line 126, in login return template_or_json('user/login.html', form=form) File "E:\myapplication\ajax.py", line 32, in template_or_json return render_template(template_name, **context) File "E:\Python27\lib\site-packages\flask-0.9-py2.7.egg\flask\templating.py", line 125, in render_template context, ctx.app) File "E:\Python27\lib\site-packages\flask-0.9-py2.7.egg\flask\templating.py", line 107, in _render rv = template.render(context) File "E:\Python27\lib\site-packages\jinja2-2.6-py2.7.egg\jinja2\environment.py", line 894, in render return self.environment.handle_exception(exc_info, True) File "E:\myapplication\templates\user\login.html", line 1, in top-level template code {% extends "layout.html" %} File "E:\Python27\lib\site-packages\jinja2-2.6-py2.7.egg\jinja2\environment.py", line 443, in _generate return generate(source, self, name, filename, defer_init=defer_init) File "E:\Python27\lib\site-packages\jinja2-2.6-py2.7.egg\jinja2\compiler.py", line 63, in generate generator.visit(node) File "E:\Python27\lib\site-packages\jinja2-2.6-py2.7.egg\jinja2\visitor.py", line 38, in visit return f(node, *args, **kwargs) File "E:\Python27\lib\site-packages\jinja2-2.6-py2.7.egg\jinja2\compiler.py", line 803, in visit_Template frame.inspect(node.body) File "E:\Python27\lib\site-packages\jinja2-2.6-py2.7.egg\jinja2\compiler.py", line 201, in inspect visitor.visit(node) File "E:\Python27\lib\site-packages\jinja2-2.6-py2.7.egg\jinja2\visitor.py", line 38, in visit return f(node, *args, **kwargs) File "E:\Python27\lib\site-packages\jinja2-2.6-py2.7.egg\jinja2\compiler.py", line 347, in visit_CallBlock self.visit(node.call) File "E:\Python27\lib\site-packages\jinja2-2.6-py2.7.egg\jinja2\visitor.py", line 39, in visit return self.generic_visit(node, *args, **kwargs) File "E:\Python27\lib\site-packages\jinja2-2.6-py2.7.egg\jinja2\visitor.py", line 43, in generic_visit for node in node.iter_child_nodes(): AttributeError: 'list' object has no attribute 'iter_child_nodes'