Импортировать модуль Python в шаблон Jinja? - PullRequest
42 голосов
/ 28 января 2011

Можно ли импортировать модуль Python в шаблон Jinja, чтобы я мог использовать его функции?

Например, у меня есть файл format.py , который содержит методы для форматирования даты и времени. В макросе Jinja я могу сделать что-то , например , следующее?

{% from 'dates/format.py' import timesince %}

{% macro time(mytime) %}
<a title="{{ mytime }}">{{ timesince(mytime) }}</a>
{% endmacro %}

Поскольку format.py не является шаблоном, приведенный выше код выдает мне эту ошибку:

UndefinedError: the template 'dates/format.py' (imported on line 2 in 'dates/macros.html') does not export the requested name 'timesince'

... но мне было интересно, есть ли другой способ добиться этого.

Ответы [ 4 ]

53 голосов
/ 28 января 2011

В шаблоне нет, вы не можете импортировать код Python.

Способ сделать это - зарегистрировать функцию как jinja2 пользовательский фильтр , например:

В вашем файле Python:

from dates.format import timesince

environment = jinja2.Environment(whatever)
environment.filters['timesince'] = timesince
# render template here

В вашем шаблоне:

{% macro time(mytime) %}
<a title="{{ mytime }}">{{ mytime|timesince }}</a>
{% endmacro %}
23 голосов
/ 08 августа 2012

Просто передайте функцию в шаблон, вот так

from dates.format import timesince
your_template.render(timesince)

и в шаблоне просто вызовите его как любую другую функцию,

{% macro time(mytime) %}
    <a title="{{ mytime }}">{{ timesince(mytime) }}</a>
{% endmacro %}

Функции - это первоклассные граждане в python, так что вы можете передавать их, как и все остальное. Вы можете даже передать целый модуль, если хотите.

6 голосов
/ 15 января 2018

Шаблон не знает import, но вы можете обучить его с помощью importlib:

import importlib
my_template.render( imp0rt = importlib.import_module )  # can't use 'import', because it's reserved

(вы также можете назвать его "import", передав аргумент с dict)

kwargs = { 'import' : importlib.import_module }
my_template.render( **kwargs )

тогда в jinja-шаблоне вы можете импортировать любой модуль:

{% set time = imp0rt( 'time' ) %}
{{ time.time() }}
2 голосов
/ 13 июня 2013

Вы можете экспортировать все символы, доступные в модуле, указав модули __dict__ в качестве параметра для метода визуализации шаблона jinja.Следующее сделает доступными функции и типы __builtin__, осмотреть и ввести типы модулей в шаблон.

import __builtin__
import inspect
import types

env=RelEnvironment()
template = env.get_template(templatefile)

export_dict={}
export_dict.update(__builtin__.__dict__)
export_dict.update(types.__dict__)
export_dict.update(inspect.__dict__)

result=template.render(**export_dict)

Внутри шаблона, чтобы использовать функцию экспортируемых модулей, аналогичную следующей:

{%- for element in getmembers(object) -%}
{# Use the getmembers function from inspect module on an object #}
{% endfor %}
...