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


101

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

Answers:


133

解决方案很简单。它实际上有据可查,但不太容易找到。(我必须仔细研究-当我尝试了几种其他的Google搜索时并没有出现。)

以下代码有效:

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


13
并从文件中获取它:settings.configure(TEMPLATE_DIRS =(“。”,))t = get_template('test.html')
布莱斯

settings.configure()的文档位于此处-docs.djangoproject.com/en/1.7/topics/settings
Scott

从上面的“有据可查”的链接开始,直到版本1.7都是如此。从1.8开始,看来您不再需要settings.configure()了。
Olaf Dietsche 2015年

如果要包括其他模板或使用模板继承,则Bryce的上述解决方案是必要的。
titusjan

6
我还需要在Template构造函数之前调用django.setup()。
阿米特

44

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'

4
我在我的项目中使用Jinja,因为我想要一些我相当熟悉的东西,但不希望我的用户(因为它是可分发的应用程序)必须安装Django。另外一个好处是Jinja可以通过easy_install进行安装。
熊恰亚诺夫,09年

4
Django也可以通过easy_install进行安装。
霸权

Jinga尚未正式支持Python3。据该网站称,它仍处于试验阶段。
普拉莫德(Framod)2015年

9

您要使用Django模板的任何特殊原因?无论神社元史是,在我看来,优越。


如果您确实愿意,请参见中的Django文档settings.py。特别是“使用设置而不设置DJANGO_SETTINGS_MODULE”部分。使用这样的东西:

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

7

我还建议jinja2。关于vs. 有一篇不错的文章,其中提供了一些详细信息,说明您为什么偏爱后者。djangojinja2


由于{% set %}语法和等同性,我更喜欢Jinja2而不是Twig模板引擎(PHP)。始终编​​写跨平台代码更好,但是性能差异并不重要-例如,python的运行速度总是比PHP慢,因此,如果需要性能,最好使用PHP,Twig和Symfony2或其他版本创建站点。悲伤但真实。
Croll

@Croll,如果您的网站执行复杂的计算,那么python库的运行速度将比以前快得多,否则瓶颈将是数据库,或者您可能做错了什么方法
Bob

4

根据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"

4

除了其他人写的东西之外,如果要在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/zh-CN/latest/releases/1.7.html#standalone-scripts


2

我也会说Jinja。它绝对比Django Templating Engine 更强大,并且是独立的

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

manage.py generatereports --format=html

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


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}

django.template.base.add_to_builtins("read")ValueError为我提出一个。
oarfish

给出TemplateDoesNotExist错误,我正在使用django 1.10.1
Vikrant Singh



0

我回应以上陈述。Jinja 2是通用模板的一个很好的Django模板超集。我认为他们正在努力使Django模板与settings.py的耦合度降低一些,但是Jinja应该为您做的更好。


0

运行manage.py外壳程序时:

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

0

Google AppEngine使用Django模板引擎,您是否看过它们的工作方式?您可以使用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.