2008-09-18 130 views
94

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

如果我运行下面的代码:

>>> 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. 

回答

127

的解决方案是简单的。它实际上是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文档(上面链接)描述你可能想要定义的一些设置(作为配置的关键字参数)。

+12

,并从文件中获得它:settings.configure( “” TEMPLATE_DIRS =(,) ) T = get_template( '的test.html') – Bryce 2013-09-16 06:51:04

+0

settings.configure()的文档在这里 - https://docs.djangoproject.com/en/1.7/topics/settings/ – Scott 2015-02-28 05:52:45

+0

从上面的“有据可查”的链接可以看出,版本1.7以前是这样的。从1开始。8,看来你不需要`settings.configure()`了。 – 2015-07-27 19:56:57

9

要使用Django的模板有什么特别的原因吗?在我看来,JinjaGenshi都是优越的。


如果你真的想,那么看看Django documentation on settings.py。尤其是“使用设置而不设置DJANGO_SETTINGS_MODULE”部分。使用这样的事情:

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

谷歌AppEngine使用Django的模板引擎,你采取一起来看看他们是如何做到的呢?你可能只是使用它。

40

Jinja2syntax与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' 
0

我赞同上述表述的。 Jinja 2是Django模板的一个非常好的超集,可用于一般用途。我认为他们正在努力使Django模板与settings.py的耦合度降低一点,但Jinja应该为你做好。

7

我也推荐jinja2。 djangojinja2有一个nice article,它提供了一些关于为什么应该优先考虑的详细信息。

1

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

2

我会说Jinja以及。这绝对是比Django模板引擎更强大,它是独立

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

manage.py generatereports --format=html 

但我不认为这是值得只是用Django的模板引擎,而不是神社。

0

当运行manage.py壳:

>>> from django import template 
>>> t = template.Template('My name is {{ me }}.') 
>>> c = template.Context({'me': 'ShuJi'}) 
>>> t.render(c) 
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} 
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" 
0

的除了写什么其他的,如果你想在Django上> 1.7使用Django模板,你必须给你的settings.configure(...)调用模板变量,并调用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) 

如果你写的DIRS变量在.configure,从盘面:

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

相关问题