2008-09-18 131 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

相關問題