Django設定templateのグローバル変数

6283 ワード

    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