105

我想在我的(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.
4

13 回答 13

134

解决方案很简单。它实际上有据可查,但不太容易找到。(我不得不四处寻找——当我尝试了几个不同的谷歌搜索时,它没有出现。)

以下代码有效:

>>> 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 文档(上面链接)。

于 2008-09-19T00:01:39.993 回答
46

Jinja2的语法与 Django 的 语法几乎相同,只有很少的差异,而且您获得了一个更强大的模板引擎,它还可以将您的模板编译为字节码(FAST!)。

我将它用于模板,包括在 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'
于 2008-09-19T00:08:41.783 回答
9

你想使用 Django 的模板有什么特别的原因吗?在我看来,JinjaGenshi都比较优秀。


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

from django.conf import settings
settings.configure (FOO='bar') # Your settings go here
于 2008-09-18T23:56:36.370 回答
7

我也会推荐jinja2。有一篇关于vs.的好文章提供了一些详细信息,说明为什么你应该更喜欢后者。djangojinja2

于 2008-09-20T21:02:58.693 回答
5

根据 Jinja 文档,Python 3 支持仍处于试验阶段。因此,如果您使用的是 Python 3 并且性能不是问题,您可以使用 django 的内置模板引擎。

Django 1.8 引入了对多个模板引擎的支持,这需要更改模板的初始化方式。您必须明确配置settings.DEBUGdjango 提供的默认模板引擎使用哪个。这是在不使用 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"
于 2015-12-28T14:00:18.747 回答
5

除了其他人写的,如果你想在 Django > 1.7 上使用 Django 模板,你必须给你的 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 错误:没有配置 DjangoTemplates 后端

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

于 2017-11-24T02:00:02.307 回答
3

感谢各位的帮助。这里还有一个补充。需要使用自定义模板标签的情况。

假设您在模块 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}
于 2013-12-09T20:37:34.113 回答
2

我也会说Jinja。它绝对比 Django 模板引擎更强大,而且它是独立的

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

manage.py generatereports --format=html

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

于 2008-12-05T22:15:35.720 回答
1

发现这个:

http://snippets.dzone.com/posts/show/3339

于 2008-09-18T23:58:12.467 回答
1

不。改用StringTemplate ——一旦你知道它,就没有理由考虑任何其他模板引擎。

于 2008-11-20T02:43:43.517 回答
0

GoogleAppEngine使用了 Django 模板引擎,你看过他们是怎么做的吗?你可能只是使用它。

于 2008-09-18T23:57:12.203 回答
0

我附和上述说法。Jinja 2 是一个非常好的通用 Django 模板超集。我认为他们正在努力使 Django 模板与 settings.py 的耦合度降低一些,但 Jinja 应该适合你。

于 2008-09-19T00:18:31.120 回答
0

运行manage.py外壳时:

>>> from django import template   
>>> t = template.Template('My name is {{ me }}.')   
>>> c = template.Context({'me': 'ShuJi'})   
>>> t.render(c)
于 2012-07-17T08:50:43.473 回答