Django設定templateのグローバル変数
Web , 。 :
1.ユーザー情報:1人のユーザーがログインに成功した後、必ず各ページに現在のログインユーザーの情報を表示してほしい.2.バックグラウンドで生成されたラベル(またはインデックス):ユーザーはラベルをクリックして異なるページをジャンプできますが、各ページにはこれらのラベルがあります.
こんな時にpyファイルのすべての方法で対応するデータを組織してページ解析に使用します.それは絶対に卵が痛いことです.このとき、私たちはこれらのデータをグローバル変数の形式に保存して、すべてのページに簡単にレンダリングする必要があります.Django
settings.py
ファイルにはこのような構成があります.
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "templates")],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
OPTIONSに気づくcontext_processorsには4つの情報がありますが、実は各情報は1つの関数に対応しています.ここでの原理は、各関数の戻り値をTemplateのグローバル変数として設定することです.最も簡単な関数requestはこのようなものです.
from django.template import context_processors.py
def request(request):
return {'request': request}
Djangoのテンプレートシステムでは、すべてのTemplateがrequestに直接アクセスできる理由が理解できます.userは対応するユーザーを取得したでしょう.リクエストがグローバル変数に設定されているため、辞書の形でバックグラウンドに転送されます.
ひょうたんを描くように、スクリプトを書くこともできます.
global_variable.py
from .models import Classification
from taggit.models import Tag
def setting(request):
classifications = Classification.objects.all()
tags = Tag.objects.all()
content = {"classifications": classifications, "tags": tags}
return content
これは私のblogシステムのコードのほんの一部で、すべての分類を取得して、すべてのTagラベルを取得して、検索しやすいです.global_variable.pyファイルはBASE_にありますDIR(これはDjangoを使ったことがある友达はすべて知っているでしょう.この変数はsettings.pyファイルの中にあります)/blog/pageディレクトリの下で、设定する必要があります
settings.py
タブで行います.
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "templates")],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
#
'blog.page.global_variable.setttings'
],
},
},
]
これでtemplatesでtagsとclassifications変数を参照できます.辛抱強くここを見てくれてありがとう.でも、下を見続けてほしい.役に立つかもしれません.
あなたが出会うかもしれない穴
次は私が書いたコードです.
views.py
def detail(request, id):
article = get_object_or_404(Article, pk=id)
template = loader.get_template("page/detail.html")
context = RequestContext(request, {'article': article})
return HttpResponse(template.render(context))
ただしDjango 1.9私にこのようなヒントを与えた
RemovedInDjango110Warning: render() must be called with a dict, not a RequestContext. 10 RequestContext
当然、私はコードを次のように変更しました.def detail(request, id):
article = get_object_or_404(Article, pk=id)
template = loader.get_template("page/detail.html")
context = {'article': article}
return HttpResponse(template.render(context))
次に災難が発生し、1.9の警告を避けたとはいえ、上のコードは、requestをRequestContext()にパッケージしてテンプレートに解析していないので、問題があります.すべてのsettingsの中で設定したグローバル変数は役に立たなくて、彼は全然グローバル変数を解析することができなくて、この穴、私を何時間も穴をあけました.だから一番いい方法はDjangoが私たちにサボってくれた方法です.
from django.shortcuts import render
def detail(request, id):
article = get_object_or_404(Article, pk=id)
return render(request, "page/detail.html", context)
RequestContext()は1.10で破棄されるそうなので、互換性を考慮して提供するインタフェースがベストです.
必ずviewの方法でrequestをバックグラウンドに伝えてくださいね.そうしないと辞書だけではグローバル変数は解析されません.
レターアドレスhttp://www.jianshu.com/p/d90469a527d4