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.
D'abord, vous devez installer jinja2
:
$ pip install Jinja2
Modifiez ensuite votre liste TEMPLATES
dans le settings.py pour contenir le jinja2
BACKEND
:
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',
],
},
},
]
où 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 .
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.
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" %}
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).