テンプレートからアクセスできるようにしたい設定がいくつかありますが、その方法がわかりません。私はすでに試しました
{{CONSTANT_NAME}}
しかし、それはうまくいかないようです。これは可能ですか?
テンプレートからアクセスできるようにしたい設定がいくつかありますが、その方法がわかりません。私はすでに試しました
{{CONSTANT_NAME}}
しかし、それはうまくいかないようです。これは可能ですか?
最も簡単なアプローチは、単一のカスタム テンプレート タグです。
from django import template
from django.conf import settings
register = template.Library()
# settings value
@register.simple_tag
def settings_value(name):
return getattr(settings, name, "")
使用法:
{% settings_value "LANGUAGE_CODE" %}
settings.MEDIA_URL
Djangoの組み込みのジェネリック ビューを使用するか、render_to_response
ショートカット関数でコンテキスト インスタンス キーワード引数を渡す場合、Django は、頻繁に使用される特定の設定定数や一部の言語設定へのアクセスをテンプレートに提供します。各ケースの例を次に示します。
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.views.generic.simple import direct_to_template
def my_generic_view(request, template='my_template.html'):
return direct_to_template(request, template)
def more_custom_view(request, template='my_template.html'):
return render_to_response(template, {}, context_instance=RequestContext(request))
settings.MEDIA_URL
これらのビューには両方とも、テンプレートで使用できる{{ MEDIA_URL }}
など、頻繁に使用される設定がいくつかあります。
設定で他の定数へのアクセスを探している場合は、次のように、必要な定数を展開して、ビュー関数で使用しているコンテキスト ディクショナリに追加するだけです。
from django.conf import settings
from django.shortcuts import render_to_response
def my_view_function(request, template='my_template.html'):
context = {'favorite_color': settings.FAVORITE_COLOR}
return render_to_response(template, context)
settings.FAVORITE_COLOR
これで、テンプレートに としてアクセスできます{{ favorite_color }}
。
チェックアウトしてくださいdjango-settings-export
(免責事項: 私はこのプロジェクトの作成者です)。
例えば...
$ pip install django-settings-export
TEMPLATES = [
{
'OPTIONS': {
'context_processors': [
'django_settings_export.settings_export',
],
},
},
]
MY_CHEESE = 'Camembert';
SETTINGS_EXPORT = [
'MY_CHEESE',
]
<script>var MY_CHEESE = '{{ settings.MY_CHEESE }}';</script>
これを行う別の方法は、設定から値を釣り上げることができるカスタム テンプレート タグを作成することです。
@register.tag
def value_from_settings(parser, token):
try:
# split_contents() knows not to split quoted strings.
tag_name, var = token.split_contents()
except ValueError:
raise template.TemplateSyntaxError, "%r tag requires a single argument" % token.contents.split()[0]
return ValueFromSettings(var)
class ValueFromSettings(template.Node):
def __init__(self, var):
self.arg = template.Variable(var)
def render(self, context):
return settings.__getattr__(str(self.arg))
その後、次を使用できます。
{% value_from_settings "FQDN" %}
コンテキストプロセッサのフープを飛び越えずに、任意のページに印刷できます。
シンプルなサイトではクリーンで効果的であるため、Berislav のソリューションが気に入っています。私が気に入らないのは、すべての設定定数を勝手に公開することです。だから私がやったことはこれでした:
from django import template
from django.conf import settings
register = template.Library()
ALLOWABLE_VALUES = ("CONSTANT_NAME_1", "CONSTANT_NAME_2",)
# settings value
@register.simple_tag
def settings_value(name):
if name in ALLOWABLE_VALUES:
return getattr(settings, name, '')
return ''
使用法:
{% settings_value "CONSTANT_NAME_1" %}
これにより、名前を付けていない定数がテンプレートで使用されないように保護されます。さらに凝ったものにしたい場合は、設定でタプルを設定し、さまざまなページ、アプリ、または領域に対して複数のテンプレート タグを作成し、単純に必要に応じて、ローカル タプルを設定タプルと組み合わせてから、リスト内包表記を実行して、値が受け入れられるかどうかを確認します。
複雑なサイトでは、これは少し単純化されていることに同意しますが、テンプレートに普遍的にあると便利な値があり、これはうまく機能しているようです. オリジナルのアイデアをくれたBerislavに感謝します!
chrisdewの答えを(独自のタグを作成するために)少し改善しました。
まず、yourapp/templatetags/value_from_settings.py
独自の新しいタグを定義するファイルを作成しvalue_from_settings
ます。
from django.template import TemplateSyntaxError, Variable, Node, Variable, Library
from yourapp import settings
register = Library()
# I found some tricks in URLNode and url from defaulttags.py:
# https://code.djangoproject.com/browser/django/trunk/django/template/defaulttags.py
@register.tag
def value_from_settings(parser, token):
bits = token.split_contents()
if len(bits) < 2:
raise TemplateSyntaxError("'%s' takes at least one " \
"argument (settings constant to retrieve)" % bits[0])
settingsvar = bits[1]
settingsvar = settingsvar[1:-1] if settingsvar[0] == '"' else settingsvar
asvar = None
bits = bits[2:]
if len(bits) >= 2 and bits[-2] == 'as':
asvar = bits[-1]
bits = bits[:-2]
if len(bits):
raise TemplateSyntaxError("'value_from_settings' didn't recognise " \
"the arguments '%s'" % ", ".join(bits))
return ValueFromSettings(settingsvar, asvar)
class ValueFromSettings(Node):
def __init__(self, settingsvar, asvar):
self.arg = Variable(settingsvar)
self.asvar = asvar
def render(self, context):
ret_val = getattr(settings,str(self.arg))
if self.asvar:
context[self.asvar] = ret_val
return ''
else:
return ret_val
このタグは、次の方法でテンプレートで使用できます。
{% load value_from_settings %}
[...]
{% value_from_settings "FQDN" %}
または経由
{% load value_from_settings %}
[...]
{% value_from_settings "FQDN" as my_fqdn %}
表記の利点は、これにより、単純なを介してブロックas ...
で簡単に使用できることです。blocktrans
{{my_fqdn}}
上記のbchhunの例は、settings.pyからコンテキストディクショナリを明示的に構築する必要があることを除いて、優れています。以下は、settings.pyのすべての大文字の属性からコンテキストディクショナリを自動構築する方法のテストされていない例です(re: "^ [A-Z0-9 _] + $")。
settings.pyの最後に:
_context = {}
local_context = locals()
for (k,v) in local_context.items():
if re.search('^[A-Z0-9_]+$',k):
_context[k] = str(v)
def settings_context(context):
return _context
TEMPLATE_CONTEXT_PROCESSORS = (
...
'myproject.settings.settings_context',
...
)
これが Django 1.3 の最も簡単なアプローチであることがわかりました。
ビュー.py
from local_settings import BASE_URL
def root(request):
return render_to_response('hero.html', {'BASE_URL': BASE_URL})
hero.html
var BASE_URL = '{{ JS_BASE_URL }}';
IanSRとbchhunの両方が、設定でTEMPLATE_CONTEXT_PROCESSORSをオーバーライドすることを提案しました。この設定にはデフォルトがあり、デフォルトを再設定せずにオーバーライドすると、厄介な問題が発生する可能性があることに注意してください。Djangoの最近のバージョンでは、デフォルトも変更されています。
https://docs.djangoproject.com/en/1.3/ref/settings/#template-context-processors
デフォルトのTEMPLATE_CONTEXT_PROCESSORS:
TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.contrib.messages.context_processors.messages")
単一の変数でコンテキストタグとテンプレートタグを比較する場合、より効率的なオプションを知ることは有益である可能性があります。ただし、その変数を必要とするテンプレートからのみ設定に浸る方がよい場合があります。その場合、変数をすべてのテンプレートに渡すことは意味がありません。ただし、base.htmlテンプレートなどの共通テンプレートに変数を送信する場合は、base.htmlテンプレートがすべてのリクエストでレンダリングされるため、どちらの方法でも使用できます。
テンプレートタグオプションを使用する場合は、次のコードを使用して、問題の変数が未定義の場合に備えて、デフォルト値を渡すことができます。
例:get_from_settings my_variable as my_context_value
例:get_from_settings my_variable my_default as my_context_value
class SettingsAttrNode(Node):
def __init__(self, variable, default, as_value):
self.variable = getattr(settings, variable, default)
self.cxtname = as_value
def render(self, context):
context[self.cxtname] = self.variable
return ''
def get_from_setting(parser, token):
as_value = variable = default = ''
bits = token.contents.split()
if len(bits) == 4 and bits[2] == 'as':
variable = bits[1]
as_value = bits[3]
elif len(bits) == 5 and bits[3] == 'as':
variable = bits[1]
default = bits[2]
as_value = bits[4]
else:
raise TemplateSyntaxError, "usage: get_from_settings variable default as value " \
"OR: get_from_settings variable as value"
return SettingsAttrNode(variable=variable, default=default, as_value=as_value)
get_from_setting = register.tag(get_from_setting)