首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Django1.8中使用jinja2作为模板引擎

如何在Django1.8中使用jinja2作为模板引擎
EN

Stack Overflow用户
提问于 2015-06-08 13:13:57
回答 2查看 22.4K关注 0票数 25

我一直在研究如何在Django1.8中使用jinja2,但在jinja2中使用django还没有完整的源代码。我想知道你们是否知道在django中使用jinja2的过程。我已经阅读了官方文档,并研究了以下问题:How to setup django 1.8 to use jinja2?

但它们都没有清楚地解释如何以更好的方式使用jinja2。我刚开始使用django,并不了解文档中的所有行话。如果能帮上忙我会很感激的。

EN

回答 2

Stack Overflow用户

发布于 2016-12-22 20:45:19

我花了相当长的时间来弄清楚所有的事情,这里的答案并没有那么有帮助。

多鲁的答案最接近事实,但并不完整。

如何使用jinja作为模板语言:

1.在项目文件夹中创建jinsa2.py文件。这是修改默认jinja2环境所必需的(在我们的例子中,传递一些额外的全局变量)。

位置:{root}/main/jinja2.py:

代码语言:javascript
复制
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项目设置文件中,包括修改后的环境。

代码语言:javascript
复制
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'environment': "main.jinja2.environment",
        },
    },
    ...
]

3.现在您不再需要在任何地方导入jinja2,在视图中,您将通过django使用django模板,就像使用django模板一样:

代码语言:javascript
复制
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']选项提供其他目录来搜索模板。

票数 15
EN

Stack Overflow用户

发布于 2021-10-08 16:31:31

Django 3+更新:现实生活配置Jinja2 3.0.X +

/settings.py

代码语言:javascript
复制
TEMPLATES = [
{
    "BACKEND": "django.template.backends.jinja2.Jinja2",
    "DIRS": [os.path.join(BASE_DIR, "ui", "templates")], # You can add a subdirectory like /jinja2 if you don't want Jinja2 to be default. But for consistency I do not recommand
    "APP_DIRS": True,
    "OPTIONS": {
        'environment': ".".join([os.path.basename(BASE_DIR), 'jinja2.environment']),
        "context_processors": [
            "django.contrib.auth.context_processors.auth",
            "django.template.context_processors.debug",
            "django.template.context_processors.i18n",
            "django.template.context_processors.media",
            "django.template.context_processors.static",
            "django.template.context_processors.tz",
            "django.contrib.messages.context_processors.messages",
        ],
    }
},
{
    "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",
        ],
    },
},]

//jinsa2.py

代码语言:javascript
复制
import inspect
import logging

from django.contrib import messages
from jinja2 import Environment, pass_context
from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse

import ui.templatetags.extras as extras_filters
from crispy_forms.utils import render_crispy_form

logger = logging.getLogger(__name__)

# /!\ This this how you make csrf token generated by crispy properly injected
@pass_context 
def crispy(context, form):
    return render_crispy_form(form, context=context)

def environment(**options):
    logger.debug("Jinja2 environment loading")
    env = Environment(**options)
    env.globals.update({
       "get_messages": messages.get_messages,
       "static": staticfiles_storage.url,
       "crispy": crispy,  # this line is different
       "url": reverse,
   })
   # Bonus, get your django custom templatetag, backward compatible with Django Template
   env.filters.update(dict(inspect.getmembers(extras_filters, inspect.isfunction)))
   return env

/ui/views.py

代码语言:javascript
复制
import logging

from django import forms
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Submit


logger = logging.getLogger(__name__)

class AddRemoteServerForm(forms.Form):
    name = forms.CharField(max_length=20, min_length=3)
    url = forms.CharField(max_length=200)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
        'name',
        'url',
        Submit('submit', 'Associate Server')
    )

/ui/views.py

代码语言:javascript
复制
def add_remote_server(request):
if request.method == 'POST':
    form = AddRemoteServerForm(request.POST)
    logger.debug(form.data.dict())
    logger.debug("Form valid ? %s " % form.is_valid())
    if form.is_valid():
        d = form.data.dict()
        # TODO: Implmenent your business logic
        return redirect('/remote_servers/')
else:
    form = AddRemoteServerForm()
context = {'form': form}
return render(request, 'form.html', context)

/ui/template/form.html

代码语言:javascript
复制
{% extends "base.html" %}
{% block extraappendjavascript %}
{% endblock %}
{% block content %}
<div class="container">
    <div class="card">
        <div class="card-body">
            {{ crispy(form) }}
        </div>

    </div>
</div>
{% endblock %}

/ui/templatetags/extras.py # Bonus,仅供参考

代码语言:javascript
复制
import logging
import os
from datetime import datetime, timedelta

from django.utils.safestring import mark_safe
from django.template import Library

import json


register = Library()

logger = logging.getLogger(__name__)
@register.filter(is_safe=True)
def js(obj):
    try:
        return mark_safe(json.dumps(obj))
    except Exception:
        return "{}"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30701631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档