Pybars не компилирует jinja if condition и for loop

Я использую платформу saleor в проекте. Я пытаюсь скомпилировать письма, имеющие синтаксис шаблонов jinja, используя pybars. Но pybars не разбирает условие if и синтаксис цикла for. Пожалуйста, подскажите мне, как разобрать эти два синтаксиса.

Спасибо!

context = {
    "site_name": "site_name",
    "order": {
        "items": [
            "one",
            "two",
            "three",
        ]
    },
}

source = """
    {% if True %}
        <div>
            {{ site_name}}
        </div>
    {% endif %}


    <div>
        {% for line in order.items %}
        <tr>
            {{ line }}
        </tr>
        {% endfor %}
    </div>

    <div>

        <p><small>This email was sent to <a href="mailto:{{site_name}}">{{site_name}}</a>.</p>

    </div>

"""


from pybars import Compiler
compiler = Compiler()


template = compiler.compile(source)
template(context)

Вывод, который я получаю, выглядит следующим образом.

'\n    {% if True %}\n        <div>\n            site_name\n        </div>\n    {% endif %}\n\n\n    <div>\n        {% for line in order.items %}\n        <tr>\n            \n        </tr>\n        {% endfor %}\n    </div>\n\n    <div>\n\n        <p><small>This email was sent to <a href="mailto:site_name">site_name</a>.</p>\n\n    </div>\n\n'

Но pybars не разбирает условие if и синтаксис цикла for. Пожалуйста, подскажите, как разобрать эти две строчки.

Это имеет смысл, поскольку pybars не является чем-то, что отображает синтаксис Jinja. Он обрабатывает синтаксис pybars. В репозитории GitHub перечислен набор возможностей этого языка.

Вы можете отобразить это с помощью шаблонизатора Jinja с:

from jinja2 import Template

Template(source).render(context)

Ваш шаблон также должен использовать {% for line in order.items() %} так с вызовом метода, иначе вы будете выполнять итерацию над методом, что приведет к ошибке.

Для данного шаблона это будет выглядеть так:

    <div>
        site_name
    </div>



<div>
    
    <tr>
        ('items', ['one', 'two', 'three'])
    </tr>
    
</div>

<div>

    <p><small>This email was sent to <a href="mailto:site_name">site_name</a>.</p>

</div>
Вернуться на верх