簡體   English   中英

如何在Django 1.8中使用jinja2作為模板引擎

[英]How to use jinja2 as a templating engine in Django 1.8

我一直在研究如何在django 1.8中使用jinja2,但是沒有完整的源代碼來使用django和jinja2。 我想知道你們是否知道在django中使用jinja2的過程。 我查看了官方文檔並查看了以下問題: 如何設置django 1.8以使用jinja2?

但是他們都沒有清楚地解釋如何以一種放棄的方式使用jinja2。 我剛開始使用django並且不知道文檔中的所有術語。 我真的很感激幫助。

首先你必須安裝jinja2

$ pip install Jinja2

然后修改settings.py中的 TEMPLATES列表以包含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',
           ],
        },
    },
]

其中templates/jinja2是您的jinja2模板文件的目錄。

並在您的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

這使得Jinja2模板中的staticurl可用。

PS有關詳細信息,請參閱此文章

花了我一些時間來弄清楚一切,這里的答案並不是那么有用。

doru的答案最接近真相,但不完整。

如何使用jinja作為模板語言:

1.在項目文件夾中創建jinja2.py文件。 這是修改默認jinja2環境所必需的(在我們的例子中,傳遞一些額外的全局變量)。

location: {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.將jinja2后端添加到django項目設置文件,包括我們修改過的環境。

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

3.現在你不再需要在任何地方導入jinja2,在你的視圖中,你將像django模板一樣通過django使用jinja模板:

from django.shortcuts import render

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

最后,將APP_DIRS設置為True,jinja將在所有已安裝的應用程序jinja2目錄中搜索模板。 (與搜索templates文件夾的DTL不同)。 如果你想改變那種行為,或者想要一些額外的調整,比如擴展匹配,過濾或全局變量,你應該看看django-jinja擴展。

您還可以通過TEMPLATES['DIRS']設置選項提供其他目錄來搜索模板。

混合Django和Jinja2模板: 環境:Django 1.8 + Jinja2

我有一些遺留的Django模板,將它們一次性重寫到Jinja2並不是那么容易,所以將這個自定義{% jinja_include "some_template.jinja" %}標記添加到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())

從你的Django模板中調用它:

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

settings.py的Django 網站 (請查看此內容以獲取進一步指導):

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

BACKEND是實現Django模板后端API的模板引擎類的虛線Python路徑。 內置的后端是django.template.backends.django.DjangoTemplates和django.template.backends.jinja2.Jinja2。

基本上找出settings.py文件中的TEMPLATES變量的位置並設置后端(或確保后端)類似於上面的那個(因為Jinga是內置的)。 如果所有失敗,請更換django.template.backends...django.template.backends.jinja2.Jinja2 (雖然我不認為這是必要的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM