418

テンプレートからアクセスできるようにしたい設定がいくつかありますが、その方法がわかりません。私はすでに試しました

{{CONSTANT_NAME}}

しかし、それはうまくいかないようです。これは可能ですか?

4

16 に答える 16

316

最も簡単なアプローチは、単一のカスタム テンプレート タグです。

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" %}
于 2011-10-10T16:58:19.407 に答える
197

settings.MEDIA_URLDjangoの組み込みのジェネリック ビューを使用するか、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 }}

于 2009-01-11T17:28:50.500 に答える
107

チェックアウトしてくださいdjango-settings-export(免責事項: 私はこのプロジェクトの作成者です)。

例えば...

$ pip install django-settings-export

設定.py

TEMPLATES = [
    {
        'OPTIONS': {
            'context_processors': [
                'django_settings_export.settings_export',
            ],
        },
    },
]

MY_CHEESE = 'Camembert';

SETTINGS_EXPORT = [
    'MY_CHEESE',
]

template.html

<script>var MY_CHEESE = '{{ settings.MY_CHEESE }}';</script>
于 2014-09-15T04:54:35.297 に答える
47

これを行う別の方法は、設定から値を釣り上げることができるカスタム テンプレート タグを作成することです。

@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" %}

コンテキストプロセッサのフープを飛び越えずに、任意のページに印刷できます。

于 2011-03-08T16:53:00.217 に答える
32

シンプルなサイトではクリーンで効果的であるため、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に感謝します!

于 2014-02-06T03:45:55.783 に答える
13

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}}

于 2011-06-14T12:16:23.747 に答える
8

上記の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',
...
)
于 2011-03-28T13:45:44.497 に答える
3

これが Django 1.3 の最も簡単なアプローチであることがわかりました。

  1. ビュー.py

    from local_settings import BASE_URL
    
    def root(request):
        return render_to_response('hero.html', {'BASE_URL': BASE_URL})
    
  2. hero.html

    var BASE_URL = '{{ JS_BASE_URL }}';
    
于 2013-08-23T19:06:53.790 に答える
1

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")
于 2011-11-23T16:20:51.717 に答える
1

単一の変数でコンテキストタグとテンプレートタグを比較する場合、より効率的なオプションを知ることは有益である可能性があります。ただし、その変数を必要とするテンプレートからのみ設定に浸る方がよい場合があります。その場合、変数をすべてのテンプレートに渡すことは意味がありません。ただし、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)
于 2011-12-11T05:29:49.060 に答える