105

(Python) コードで Django テンプレート エンジンを使用したいのですが、Django ベースの Web サイトを構築していません。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

解決策は簡単です。実際には十分に文書化されていますが、見つけるのは簡単ではありません。(私は掘り下げなければなりませんでした - いくつかの異なる 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 のドキュメント (上記のリンク) を参照してください。

于 2008-09-19T00:01:39.993 に答える
46

Jinja2の 構文は 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'
于 2008-09-19T00:08:41.783 に答える
9

Django のテンプレートを使用したい特別な理由はありますか? 私の意見では、ジンジャゲンシはどちらも優れています。


本当に必要な場合は、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

助けてくれてありがとう。ここで、もう 1 つ追加します。カスタム テンプレート タグを使用する必要がある場合。

モジュール 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

ジンジャーとも言います。これは間違いなくDjango テンプレート エンジンより強力で、スタンドアロンです。

これが既存の Django アプリケーションへの外部プラグである場合、カスタム コマンドを作成し、プロジェクト環境内でテンプレート エンジンを使用できます。このような;

manage.py generatereports --format=html

しかし、Jinja の代わりに Django テンプレート エンジンを使用するだけの価値はないと思います。

于 2008-12-05T22:15:35.720 に答える
1

しないでください。代わりにStringTemplateを使用してください。一度知ったら、他のテンプレート エンジンを検討する理由はありません。

于 2008-11-20T02:43:43.517 に答える
1

これを見つけました:

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

于 2008-09-18T23:58:12.467 に答える
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 に答える