2012-08-16 13 views
6

में एक कॉल नोड को पास सूची तर्क पास करें, मैं अब कुछ घंटों के लिए Jinja2 विस्तार बनाने के लिए संघर्ष कर रहा हूं, और ऐसा लगता है कि मैं निश्चित रूप से एक विशेष बिंदु पर फंस गया हूं: कॉल नोड को सूची तर्क पास करना। मैंने कुछ अन्य कामकाजी सीमाओं के साथ प्रेरणा पाने की कोशिश की और मैं नहीं देख सकता कि मेरा संदर्भ कोड क्यों करता है जब मेरी सामग्री काम नहीं करती है।एक Jinja2 एक्सटेंशन

असल में क्या मैं चाहता हूँ मेरे टेम्पलेट में सामान इस तरह का है:

{% usebundle "common", "treeview" %}

इस संदर्भ में कुछ सूची में 'आम' और 'treeview' तार जोड़ने चाहिए।

यहाँ मेरी कोड के मुख्य भागों हैं:

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') 

    # At this point, names is a correctly filled array of names 
    call = self.call_method('_callback', args=[nodes.List(names)]) 
    result = nodes.CallBlock([call], [], [], []) 
    result.set_lineno(lineno) 
    return result 

    def _callback(self, names, caller=None): 
    # Here names should contain a list of names, but it's either undefined or 
    # a list of Undefined, or I get an error before reaching this callback 
    # (generally saying that arguments cannot be read) 
    pass 

मैं कई चीजें कोशिश की, लेकिन बात मुझे कहना है कि समस्या वास्तव में (मेरी names मूल्य की सामग्री को पैरामीटर स्वरूप में है कि बनाता है पार्स फ़ंक्शन) यह है कि यदि मैं nodes.List(names) को nodes.Const(42) से प्रतिस्थापित करता हूं, तो मुझे कॉलबैक पैरामीटर में एक सही 42 मान प्राप्त होता है।

[संपादित करें] कोड के इस संस्करण के लिए त्रुटि विवरण निम्नलिखित है:

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' 
+1

के बजाय का उपयोग करने से आप अपने त्रुटि संदेश और/या पूर्ण ट्रैस बैक शामिल करने के लिए चाहता हूँ एक बेहतर जवाब पाने के लिए किया है। – stderr

उत्तर

2

CallBlock पहला तर्क है, न कि कॉल के कुछ सूची के रूप में वास्तविक कॉल की उम्मीद है।

तो, तुम सिर्फ

nodes.CallBlock(call, [], [], []) 

nodes.CallBlock([call], [], [], [])