残りのDjangoなしでDjangoテンプレートを使用するにはどうすればよいですか?


101

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

回答:


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')
Bryce

settings.configure()のドキュメントはこちら-docs.djangoproject.com/en/1.7/topics/settings
Scott

上記の「十分に文書化された」リンクから、これはバージョン1.7まで当てはまります。1.8からは、settings.configure()もう必要ないようです。
Olaf Dietsche 2015

他のテンプレートを含める場合、またはテンプレートの継承を使用する場合は、ブライスによる上記のソリューションが必要です。
titusjan 2015

6
さらに、テンプレートコンストラクタの前にdjango.setup()を呼び出す必要がありました。
Amit

44

ジンジャ2 構文は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でインストールできることです。
Xiong Chiamiov 2009

4
Djangoはeasy_installでもインストールできます。
hegemon

Jingaはまだ正式にPython3をサポートしていません。サイトによると、それはまだ実験的です。
Pramod、2015

9

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


本当にしたい場合は、Djangoのドキュメントをsettings.py参照してください。特に「設定なしで設定を使用する」セクションDJANGO_SETTINGS_MODULE。このようなものを使用してください:

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

7

私もjinja2をお勧めします。vs に関する優れた記事があり、なぜ後者を優先すべきかについての詳細な情報を提供しています。djangojinja2


{% set %}構文とTwigテンプレートエンジン(PHP)との同等性のため、私はJinja2を好みます。常にクロスプラットフォームコードを記述する方が良いですが、パフォーマンスの違いは重要ではありません。たとえば、Pythonは常にPHPよりも遅く動作するため、パフォーマンスが必要な場合は、PHP、Twig、Symfony2などでサイトを作成することをお勧めします。悲しいが真実。
2015年

@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テンプレートをDjango> 1.7で使用したい場合は、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


2

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

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

manage.py generatereports --format=html

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


2

助けてくれてありがとう。ここにもう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}

django.template.base.add_to_builtins("read")ValueError私のために発生させます。
oarfish

TemplateDoesNotExistdjango 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テンプレートエンジンを使用していますが、それをどのように行うか見てみましたか?あなたはおそらくそれを使うことができるでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.