web-dev-qa-db-fra.com

Comment utiliser jinja2 comme moteur de template dans Django 1.8

J'ai cherché à utiliser jinja2 dans Django 1.8, mais il n'y a pas de source complète pour utiliser Django avec jinja2. Je me demandais si vous saviez le processus d'utilisation de jinja2 dans Django. J'ai parcouru la documentation officielle et j'ai regardé la question suivante: Comment configurer Django 1.8 pour utiliser jinja2?

mais aucun d'entre eux n'explique clairement comment utiliser jinja2 de manière simplifiée. Je viens de commencer à utiliser Django et je ne connais pas tout le jargon dans les documents. J'apprécierais vraiment l'aide.

21
biiiju

D'abord, vous devez installer jinja2:

$ pip install Jinja2

Modifiez ensuite votre liste TEMPLATES dans le settings.py pour contenir le jinja2BACKEND:

TEMPLATES = [

    {
        'BACKEND': 'Django.template.backends.jinja2.Jinja2',
        'DIRS': [os.path.join(BASE_DIR, 'templates/jinja2')],
        'APP_DIRS': True,
        'OPTIONS': {'environment': 'myproject.jinja2.Environment',}, 
    },
    {
        'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
        'context_processors': [
            'Django.template.context_processors.debug',
            'Django.template.context_processors.request',
            'Django.contrib.auth.context_processors.auth',
            'Django.contrib.messages.context_processors.messages',
           ],
        },
    },
]

templates/jinja2 est le répertoire contenant vos fichiers de modèle jinja2.

Et dans votre fichier views.py:

from __future__ import absolute_import  # Python 2 only
from jinja2 import Environment
from Django.contrib.staticfiles.storage import staticfiles_storage
from Django.urls import reverse

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

Cela rend static et url disponibles dans vos modèles Jinja2.

P.S. Pour plus de détails, voir cet article .

23
doru

Cela m'a pris un certain temps pour tout comprendre, les réponses ici n'étaient pas du tout utiles.

la réponse de Doru est la plus proche de la vérité mais est incomplète.

Comment utiliser jinja comme langage de template:

1.Créez le fichier jinja2.py dans votre dossier de projet. Ceci est nécessaire pour modifier l'environnement jinja2 par défaut (dans notre cas, en passant quelques variables globales supplémentaires).

emplacement: {root}/main/jinja2.py:

from __future__ import absolute_import  # Python 2 only
from jinja2 import Environment
from Django.contrib.staticfiles.storage import staticfiles_storage
from Django.core.urlresolvers import reverse

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

2.Ajoutez le backend jinja2 au fichier de paramètres du projet Django, y compris notre environnement modifié.

TEMPLATES = [
    {
        'BACKEND': 'Django.template.backends.jinja2.Jinja2',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'environment': "main.jinja2.environment",
        },
    },
    ...
]

3.Maintenant, vous n'avez plus besoin d'importer jinja2 n'importe où, dans vos vues, vous utiliserez des modèles jinja via Django tout comme Django templates:

from Django.shortcuts import render

def index(request, **kwargs):
    return render(request, "index.html.j2", {'title': 'MyTitle', 'text': "MyText"})

Et enfin, avec APP_DIRS défini sur True, jinja recherchera des modèles dans toutes les applications installées jinja2 répertoires. (contrairement à DTL qui recherche le dossier templates). Si vous voulez changer ce comportement, ou si vous voulez quelques ajustements supplémentaires, comme la correspondance d'extension, le filtrage ou les variables globales, vous devriez regarder l'extension Django-jinja.

Vous pouvez également fournir des répertoires supplémentaires pour rechercher des modèles via TEMPLATES['DIRS'] option de réglages.

7
IvanX

Mixte Django et modèle Jinja2: Environnement: Django 1.8 + Jinja2.

J'ai quelques modèles hérités Django et ce n'est pas si facile de les réécrire tous à la fois dans Jinja2, alors ajoutez cette _ {% jinja_include "some_template.jinja" %} tag vers my_custom_tags.py:

from Django.template.loader import get_template
from Django import template
register = template.Library()

@register.simple_tag(takes_context=True)
def jinja_include(context, filename):
    template = get_template(filename)
    return template.render(context.flatten())

Appelez-le comme ceci depuis votre modèle Django:

{% load my_custom_tags %}
{% jinja_include "some_template.jinja" %}
1
Kostyantyn

Depuis le Django site Web (veuillez consulter ceci pour plus d'informations) dans settings.py:

TEMPLATES = [
    {
        'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... some options here ...
        },
    },
]

BACKEND est un chemin en pointillé Python vers une classe de moteur de modèle implémentant l'API de backend de modèle de Django. Les backends intégrés sont Django.template.backends.Django.DjangoTemplates et Django.template.backends.jinja2. Jinja2.

Fondamentalement, découvrez où se trouve dans votre fichier settings.py une variable TEMPLATES et définissez le backend (ou assurez-vous que le backend) ressemble à celui ci-dessus (car Jinga est intégré). Si tout échoue, remplacez le Django.template.backends... avec Django.template.backends.jinja2.Jinja2 (bien que je ne pense pas que ce soit nécessaire).

0
nonamorando