web-dev-qa-db-ja.com

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

(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.
99
Daryl Spitzer

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

131
Daryl Spitzer

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'
43
nosklo

Djangoのテンプレートを使用したい特定の理由はありますか? JinjaGenshi はどちらも優れていると思います。


本当にしたい場合は、 Django documentation on settings.py 。特に、「設定なしで設定を使用するDjango_SETTINGS_MODULE "。次のようなものを使用します。

from Django.conf import settings
settings.configure (FOO='bar') # Your settings go here
9
John Millikin

私もjinja2をお勧めします。 Django vs. jinja2には Nice article があります。

7
olt

Jinjaのドキュメントによると、 Python 3のサポートはまだ実験的です です。したがって、Python 3であり、パフォーマンスが問題にならない場合は、Djangoの組み込みテンプレートエンジンを使用できます。

Django 1.8では、 複数テンプレートエンジン のサポートが導入されました。テンプレートの初期化方法を変更する必要があります。明示的に構成する必要がありますsettings.DEBUGこれは、Djangoが提供するデフォルトのテンプレートエンジンによって使用されます。 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
Pramod

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

Jinja も言うでしょう。これは間違いなくDjango Templating Engineより強力です)であり、スタンドアロンです。

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

manage.py generatereports --format=html

しかし、Jinjaの代わりにDjango Templating Engineを使用するだけの価値はないと思います。

2
muhuk

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

1
Rob Williams

これを見つけました:

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

1
Lou Franco

他の記述に加えて、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

1

manage.pyシェルの実行中:

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

Google AppEngineは、Djangoテンプレートエンジンを使用していますが、どのように実行されているか見てみましたか?それを使用することもできます。

0
William Keller

上記の声明を繰り返します。 Jinja 2は、Djangoテンプレートを一般的に使用するための非常に優れたスーパーセットです。彼らは、Django .py、しかしJinjaはあなたのためにうまくいくはずです。

0
Clint Ecker