jinja2渲染问题:AttributeError:'unicode'对象没有属性'__call__'

时间:2016-03-18 11:26:37

标签: python jinja2

我正在尝试执行以下filtered transaction report from the piecash project

from __future__ import print_function
import datetime
import re
import os.path

from piecash import open_book


if __name__=='__main__':
    this_folder = os.path.dirname(os.path.realpath(__file__))
    s = open_book(os.path.join(this_folder, "teste.gnucash"), open_if_lock=True)
else:
    s = open_book(os.path.join("teste.gnucash"), open_if_lock=True)

# get default currency
print(s.default_currency)

regex_filter = re.compile(u"^/Ativos/Dinheiro/Carteira")

# retrieve relevant transactions
transactions = [tr for tr in s.transactions  # query all transactions in the book/session and filter them on
                if (regex_filter.search(tr.description)  # description field matching regex
                    or any(regex_filter.search(spl.memo) for spl in tr.splits))  # or memo field of any split of transaction
                and tr.post_date.date() >= datetime.date(2016, 03, 1)]  # and with post_date no later than begin nov.

try:
    import jinja2
except ImportError:
    print("\n\t*** Install jinja2 ('pip install jinja2') to test the jinja2 template version ***\n")
    jinja2 = None

if jinja2:
    env = jinja2.Environment(trim_blocks=True, lstrip_blocks=True)
    print(env.from_string("""
    Here are the transactions for the search criteria '{{regex.pattern}}':
    {% for tr in transactions %}
    - {{ tr.post_date.strftime("%Y/%m/%d") }} : {{ tr.description }}
      {% for spl in tr.splits %}
        {{ spl.value.__abs__() }} {% if spl.value < 0 %} --> {% else %} <-- {% endif %} {{ spl.account.fullname() }} : {{ spl.memo }}
      {% endfor %}
    {% endfor %}
    """).render(transactions=transactions,regex=regex_filter))

但是,在尝试渲染jinja2模板时,我在代码的最后一行收到以下错误:

  

AttributeError:'unicode'对象没有属性' call '

我发现this question的最后一个答案(来自@brianz)对这个问题有所了解。 transactions是一个unicode字符串列表,而regex_filter是一个已编译的正则表达式正则表达式对象,模板是由regex.pattern中的模板提取的。

我尝试直接传递regex.pattern但没有成功,尝试按照jinja2 api render示例。

关于我究竟缺少什么的任何想法?

1 个答案:

答案 0 :(得分:2)

.format()的最后一行会出现很多问题,特别是我注意到了:

{{ spl.account.fullname() }}

这似乎是一种可能是属性或方法的名称I asked,它似乎实际上是你试图调用的unicode。神秘解决了;)