← Верните меня обратно

Django Jinja2 Markdown

2025-02-10 • ksh

Когда в Django запилили поддержку шаблонов на Jinja2, это была настоящая революция. Потому что встроенный шаблонизатор джанги — эталонный кусок говна. Основная претензия — оно не поддерживает функции, поэтому всё, что сложнее тупого вывода переменной, в нём приходилось делать через жопу. Точнее, через context processors.

Проблема перехода на jinja2 в том, что практически все пакеты для джанги написаны исключительно под родной шаблонизатор.

Допустим, вы подключили к своему любимому проекту на django поддержку jinja2, переделали шаблоны по-нормальному, кайфанули, а потом вам надо присобачить, ну, допустим, маркдаун. И вы в ступоре, потому что django-markdownx, например, с джинжей и не работает.

Итак, как добавить рендеринг markdown в шаблоны jinja2?

Как сообщает официальная документация, подключение jinja2 выглядит вот так.

В settings.py

TEMPLATES = [
    {
        «BACKEND»: 'django.template.backends.jinja2.Jinja2',
        «DIRS»: [BASE_DIR / 'jinja2'],
        «APP_DIRS»: True,
        'OPTIONS': {
            'environment': 'myproject.jinja2.environment',
        },
    },

И в myproject/jinja2.py

from django.templatetags.static import static
from django.urls import reverse

from jinja2 import Environment

def environment (**options):
    env = Environment (**options)
    env.globals.update (
        {
            «static»: static,
            «url»: reverse,
        }
)
    return env

Таким образом, вы передаёте в конекст функции static и url

Ну давайте туда же добавим маркдаун.

Для начала, конечно, его надо поставить — pip install markdown. В requirements.txt добавить — ну, это и дураку понятно. А потом всё просто — в myproject/jinja2.py добавляем следующее

…
from markdown import markdown
…
    env.globals.update (
        {
…тут ваши функции, которые тянете в контекст
        }
)
…а тут добавляем новый фильтр для jinja2
    env.filters.update (
        {
            «markdown»: lambda text, *args, **kwargs: markdown (text, *args, **kwargs),
        }

И всё.

Теперь в шаблонах можете использовать следующую конструкцию — она преобразует маркдаун в html

{{ post.text | markdown | safe }}

А django-markdownx можете нахуй выкинуть.

Да, вы, конечно, могли это спросить у нейросетки, но код, который она вам даст, будет не таким элегантным — инфа 100%.