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

StackOverflow https://stackoverflow.com/questions/98135

質問

(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.
役に立ちましたか?

解決

解決策は簡単です。それは実際には よく文書化されている, 、しかし、見つけるのはそれほど簡単ではありません。(いろいろ調べなければなりませんでした。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 のドキュメント (上にリンク) を参照してください。

他のヒント

神社2 構文 は 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'

Django のテンプレートを使用する特別な理由はありますか?両方 神社 そして ゲンシ 私の意見では、彼らは優れています。


本当に見たい場合は、 Django のドキュメント settings.py. 。特に「設定をせずに設定を使用する」セクション DJANGO_SETTINGS_MODULE」。次のようなものを使用します。

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

jinja2もおすすめです。があります 素敵な記事 の上 djangojinja2 後者を選択する理由について詳しく説明します。

神社の資料によると、 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"

私なら言います 神社 同じように。それは間違いなく より強力な Django テンプレート エンジンよりも 一人で立つ.

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

manage.py generatereports --format=html

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

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

これを見つけました:

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

やめてください。使用 文字列テンプレート 代わりに、一度他のテンプレート エンジンについて知ってしまえば、それを検討する理由はありません。

他の人が書いたことに加えて、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)

DIRS 変数を .configure にディスクから書き込んだ場合:

from django.template.loader import get_template
t = get_template('a.html')
t.render({'name': 5})

ジャンゴエラー:DjangoTemplates バックエンドが構成されていません

http://django.readthedocs.io/en/latest/releases/1.7.html#standalone-scripts

私は上記の発言を繰り返します。Jinja 2 は、一般的な用途に適した Django テンプレートのスーパーセットです。彼らは Django テンプレートと settings.py の結合を少し減らすことに取り組んでいると思いますが、Jinja はうまくやってくれるはずです。

実行中、 manage.py シェル:

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

グーグル AppEngine は Django テンプレート エンジンを使用していますが、その仕組みを調べましたか?それをそのまま使うこともできるかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top