Cet article est l'article du 16e jour du calendrier de l'avent Django 2016.
En termes simples, c'est un moteur de modèle Python. Page officielle: http://jinja.pocoo.org/ Inspiré du moteur de template de Django, il ressemble au moteur de template par défaut de Django. Jinja2 est plus riche en fonctionnalités que le moteur de modèle de Django et peut être utilisé à d'autres fins telles que LaTex et le courrier électronique, plutôt qu'un moteur de modèle dédié à l'écriture de HTML et XML.
Officiellement pris en charge depuis Django 1.8. (L'installation de la bibliothèque est requise)
À propos, l'origine du nom est Si vous traduisez le sanctuaire en anglais, Temple, Template et Temple ont des prononciations similaires → Il semble être Jinja
w
Je suis nouveau sur Django, donc je n'ai jamais utilisé Jinja2 avec Django me demandant si je devais utiliser le moteur de template par défaut pour le moment. Je l'ai utilisé dans Other Uses (je suis désolé pour mon article w), mais je n'ai rien fait de spécial, donc j'ai beaucoup lu la documentation. Il n'y a pas une telle chose.
~~ Je suis plus habitué à Rails que Django lors du développement de frameworks Web, donc je veux vraiment utiliser Slim made by Ruby ~~ Il existe un moteur de template plus pratique pour faciliter le développement. Je voulais l'utiliser si possible, alors cette fois j'ai décidé d'étudier Jinja2 en me concentrant sur l'utilisation dans Django.
Il semble que Django dispose également d'un moteur de template de type Slim, mais je l'ai arrêté car il y a peu d'informations et il semble difficile de chercher.
** Cet article ne décrit que les choses liées à Django, je ne couvrirai donc pas d'autres utilisations. ** **
En fait, remplacer le template Django par Jinja2 m'a semblé difficile, donc cette fois j'ai juste remplacé une petite partie du projet existant par un essai. Comme je l'écrirai dans le prochain élément d'introduction, le moteur de modèle par défaut et Jinja2 ont été mélangés dans un seul projet. ** Python 3.3 et supérieur ne semble pas être entièrement pris en charge **, vous devez donc faire attention si vous utilisez 3.4 ou supérieur. Cependant, puisque le test lui-même a réussi, même s'il y a des bogues, seuls les petits le seront. http://jinja.pocoo.org/docs/dev/intro/#experimental-python-3-support
Réécrivez TEMPLATE dans le fichier settings.py de Django comme suit.
Par défaut, Jinja2 recherchera dans le répertoire jinja2 des fichiers modèles, donc passer à Jinja2 avec BACKEND
dans l'état habituel ne fonctionnera pas.
Il semble qu'il soit nécessaire de changer le nom du répertoire des modèles de chaque application en jinja2 ou de le spécifier explicitement avec DIRS
.
Dans l'exemple ci-dessous, le paramètre Jinja2 est ajouté au paramètre habituel (?).
Dans mon environnement de développement local, j'ai mis django_debug_toolbar etc., mais afin de passer le chemin vers les modèles de ces bibliothèques, je devais également mettre les paramètres habituels du modèle. Dans un environnement de production, ces bibliothèques ne sont pas utilisées, et seuls les modèles définis par eux-mêmes sont utilisés (probablement), il semble donc que seuls les paramètres Jinja2 soient suffisants.
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [os.path.join(BASE_DIR, 'templates/jinja2')],
'APP_DIRS': True,
},
{
'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',
],
},
},
]
La documentation est complète, mais il y a de nombreuses parties qui ne sont pas pertinentes pour une utilisation en tant que moteur de template de Django, donc pour le moment, je pense que vous pouvez voir ce que vous pouvez faire en regardant l'URL ci-dessous. http://jinja.pocoo.org/docs/dev/templates/#synopsis
Bien qu'il s'appelle Django Inspire, il existe de nombreuses différences dans les spécifications détaillées, je ne présenterai donc que les différences majeures.
Avec JinJa2, vous pouvez écrire des traitements comme Python même sur un modèle.
Comme indiqué ci-dessous, Django n'a pas (), mais Jinja2 ajoute ().
Django: {% for page in user.get_created_pages %}
Jinja2: {% for page in user.get_created_pages() %}
Grâce à cela, il est possible d'ajouter order_by au modèle Django côté template. Cependant, je ne pense pas que ce soit cool de presser une telle description du côté du modèle.
http://jinja.pocoo.org/docs/dev/templates/#macros Dans Django, si vous voulez faire autre chose que le traitement fourni depuis le début sur le modèle, je pense que vous avez défini votre propre balise de modèle, mais dans Jinja2, vous le définissez en utilisant quelque chose appelé macro. La macro définie dans le modèle peut être réutilisée à l'aide de call. Je vais omettre les détails w
http://jinja.pocoo.org/docs/dev/templates/#list-of-builtin-filters Il existe étonnamment de nombreux filtres. C'est une impression que vous pouvez utiliser ou avoir des méthodes qui peuvent être utilisées pour chacun des tableaux, chaînes de caractères et objets numériques de Python.
http://jinja.pocoo.org/docs/dev/templates/#math J'utilise django-mathfilter quand je veux exécuter quatre règles sur un modèle avec Django, mais Jinja2 ne semble pas en avoir besoin. C'est sobre, mais je suis content. Il existe également de nombreux opérateurs de comparaison.
C'est extrêmement plus facile que de créer et d'utiliser vous-même des balises de modèle.
Par exemple, lorsque vous souhaitez afficher les variables suivantes dans un modèle
foo = {"bar": 1}
Pour le modèle par défaut de Django
foo.bar
Par conséquent, vous ne pouvez pas écrire foo [" bar "]
, mais dans le cas de Jinja2, vous pouvez également utiliser foo [" bar "]
.
Je suis également heureux car il me semblait toujours étrange d'accéder aux variables dict avec des points.
http://qiita.com/ryu22e/items/e50f8a3fbd6fe836c1b4 Je ne l'écrirai pas car certaines personnes ont déjà écrit l'article. Je pense que context_processor est applicable au moteur de template par défaut de Django, mais je ne suis pas sûr que la possibilité de définir des variables globales soit l'avantage de Jinja2 car je ne l'ai jamais fait moi-même.
Il a plus de fonctionnalités que ce à quoi je m'attendais et c'est devenu un article approximatif.
C'est très polyvalent et je veux l'utiliser tout de suite, mais bien qu'il s'appelle Django Inspire, il y a beaucoup de différences mineures, et j'ai eu l'impression que remplacer un projet existant par Jinja2 semble un peu ennuyeux. Lors du passage à Slim avec Rails, il existe une commande de conversion, il était donc relativement facile de passer, mais Jinja2 semble impossible à moins que vous ne vérifiiez tout correctement. J'aimerais l'essayer lors de la création d'une nouvelle application.
De plus, je ne pense pas qu'il soit bon de bourrer la logique du côté du modèle ou de toucher les données en premier lieu, alors j'ai pensé que je devais être particulièrement prudent lors de l'utilisation de Jinja2. La même chose est écrite dans le document. http://jinja.pocoo.org/docs/dev/faq/#isn-t-it-a-terrible-idea-to-put-logic-into-templates
Recommended Posts