如何在没有Django的其余部分的情况下使用Django模板?

时间:2008-09-18 23:55:21

标签: python django templates django-templates template-engine

我想在我的(Python)代码中使用Django模板引擎,但我不是在构建基于Django的网站。如何在没有settings.py文件(和其他人)的情况下使用它并且必须设置DJANGO_SETTINGS_MODULE环境变量?

如果我运行以下代码:

>>> import django.template
>>> from django.template import Template, Context
>>> t = Template('My name is {{ my_name }}.')

我明白了:

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.

13 个答案:

答案 0 :(得分:131)

解决方案很简单。它实际上是well documented,但不容易找到。 (我不得不四处寻找 - 当我尝试一些不同的谷歌搜索时,它没有出现。)

以下代码有效:

>>> from django.template import Template, Context
>>> from django.conf import settings
>>> settings.configure()
>>> t = Template('My name is {{ my_name }}.')
>>> c = Context({'my_name': 'Daryl Spitzer'})
>>> t.render(c)
u'My name is Daryl Spitzer.'

请参阅Django文档(上面链接),了解您可能想要定义的一些设置的描述(作为配置的关键字参数)。

答案 1 :(得分:43)

Jinja2 syntax与Django几乎完全相同,只有很少的差异,你会得到一个更强大的模板引擎,它也会将你的模板编译为字节码(快!)。

我用它来模板化,包括在Django本身,它非常好。如果缺少某些功能,您也可以轻松编写扩展名。

以下是代码生成的一些演示:

>>> import jinja2
>>> print jinja2.Environment().compile('{% for row in data %}{{ row.name | upper }}{% endfor %}', raw=True) 
from __future__ import division
from jinja2.runtime import LoopContext, Context, TemplateReference, Macro, Markup, TemplateRuntimeError, missing, concat, escape, markup_join, unicode_join
name = None

def root(context, environment=environment):
    l_data = context.resolve('data')
    t_1 = environment.filters['upper']
    if 0: yield None
    for l_row in l_data:
        if 0: yield None
        yield unicode(t_1(environment.getattr(l_row, 'name')))

blocks = {}
debug_info = '1=9'

答案 2 :(得分:9)

您想使用Django模板的任何特殊原因?在我看来,JinjaGenshi都是优越的。


如果你真的想,请参阅Django documentation on settings.py。特别是“使用设置而不设置DJANGO_SETTINGS_MODULE”部分。使用这样的东西:

from django.conf import settings
settings.configure (FOO='bar') # Your settings go here

答案 3 :(得分:7)

我也推荐jinja2。 djangojinja2之间有一个nice article,可以提供有关您为何应该优先考虑后者的详细信息。

答案 4 :(得分:3)

根据Jinja文件,Python 3 support is still experimental。因此,如果您使用的是Python 3并且性能不是问题,那么您可以使用django内置的模板引擎。

Django 1.8引入了对multiple template engines的支持,这需要更改模板初始化的方式。您必须显式配置由django提供的默认模板引擎使用的settings.DEBUG。这是使用模板而不使用django其余部分的代码。

from django.template import Template, Context
from django.template.engine import Engine

from django.conf import settings
settings.configure(DEBUG=False)

template_string = "Hello {{ name }}"
template = Template(template_string, engine=Engine())
context = Context({"name": "world"})
output = template.render(context) #"hello world"

答案 5 :(得分:2)

我也会说Jinja。它肯定比Django模板引擎更强大,并且独立

如果这是现有Django应用程序的外部插件,您可以创建a custom command并在项目环境中使用模板引擎。像这样;

manage.py generatereports --format=html

但我不认为使用Django模板引擎代替Jinja是值得的。

答案 6 :(得分:2)

感谢帮助人员。这是另外一个补充。您需要使用自定义模板标记的情况。

假设您在模块read.py

中有这个重要的模板标记
from django import template

register = template.Library()

@register.filter(name='bracewrap')
def bracewrap(value):
    return "{" + value + "}"

这是html模板文件“temp.html”:

{{var|bracewrap}}

最后,这是一个将与所有人联系在一起的Python脚本

import django
from django.conf import settings
from django.template import Template, Context
import os

#load your tags
from django.template.loader import get_template
django.template.base.add_to_builtins("read")

# You need to configure Django a bit
settings.configure(
    TEMPLATE_DIRS=(os.path.dirname(os.path.realpath(__file__)), ),
)

#or it could be in python
#t = Template('My name is {{ my_name }}.')
c = Context({'var': 'stackoverflow.com rox'})

template = get_template("temp.html")
# Prepare context ....
print template.render(c)

输出为

{stackoverflow.com rox}

答案 7 :(得分:1)

答案 8 :(得分:1)

别。请改用StringTemplate - 一旦您了解它,就没有理由考虑任何其他模板引擎。

答案 9 :(得分:1)

如果你想在Django上使用Django模板,那么对其他人写的补充> 1.7,你必须给你的settings.configure(...)调用TEMPLATES变量并调用django.setup(),如下所示:

from django.conf import settings

settings.configure(TEMPLATES=[
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['.'], # if you want the templates from a file
        'APP_DIRS': False, # we have no apps
    },
])

import django
django.setup()

然后你可以从字符串中正常加载你的模板:

from django import template   
t = template.Template('My name is {{ name }}.')   
c = template.Context({'name': 'Rob'})   
t.render(c)

如果您在.configure中从磁盘中编写了DIRS变量:

from django.template.loader import get_template
t = get_template('a.html')
t.render({'name': 5})

Django Error: No DjangoTemplates backend is configured

http://django.readthedocs.io/en/latest/releases/1.7.html#standalone-scripts

答案 10 :(得分:0)

Google AppEngine使用Django模板引擎,你看看他们是如何做到的吗?你可以使用它。

答案 11 :(得分:0)

我赞同上述陈述。 Jinja 2是Django模板的一个很好的超集,适用于一般用途。我认为他们正在努力使Django模板与settings.py的关联性稍差,但Jinja应该为你做好。

答案 12 :(得分:0)

运行manage.py shell时:

>>> from django import template   
>>> t = template.Template('My name is {{ me }}.')   
>>> c = template.Context({'me': 'ShuJi'})   
>>> t.render(c)