Django:テンプレート内からセッション変数にアクセスする?


133

Djangoでセッション変数を設定すると、次のようになります。

request.session["name"] = "name"

テンプレート内からアクセスできる方法はありますか、それともビュー内から取得してテンプレートに渡す必要がありますか?

テンプレート内でアクセスしたい約10個の小さなセッション変数があるので質問し、ビューからテンプレートに10個すべてを渡すと少し面倒になる可能性があります。

(HttpResponseRedirectであるため、セッション変数を使用する必要がありますが、データベースに変数を格納することは、私の目的にとってはやりすぎです。)

だから-テンプレート内で直接セッション変数を取得する方法はありますか?

回答:


224

あなたは追加する必要がありdjango.core.context_processors.request、あなたにテンプレートコンテキストプロセッサ。その後、次のようにアクセスできます。

{{ request.session.name }}

カスタムビューを使用している場合は、必ずRequestContextインスタンスを渡してください。ドキュメントからの例:

from django.shortcuts import render_to_response
from django.template import RequestContext

def some_view(request):
    # ...
    return render_to_response('my_template.html',
                              my_data_dictionary,
                              context_instance=RequestContext(request))

2013年更新:私がこの回答に対してまだ受け取っている賛成票から判断すると、人々はそれが最初に書かれてから3年以上経過しているにもかかわらず、それが役立つと感じています。ただし、上記のビューコードは引き続き有効ですが、現在ではこれを行うための非常に簡単な方法があることに注意してください。render()はと非常によく似た関数ですが、明示的に渡す必要なく、自動的render_to_response()に使用されRequestContextます。

from django.shortcuts import render

def some_view(request):
    # ...
    return render(request, 'my_template.html', my_data_dictionary)

9
デフォルトを上書きせずにテンプレートコンテキストプロセッサにdjango.core.context_processors.requestを追加する方法については、stackoverflow.com / questions / 2246725 /…を参照してください。
Rick Westera

レンダーの代わりにHttpResponseを使用すると、テンプレートでセッション属性を取得できます。混乱しています
cafebabe1991

@ cafebabe1991どういう意味ですか?HttpResponse質問は、関連するようではありませんので、クラスは...、すべてのテンプレートを扱っていない
Ludwik Trammer

ええ、実際に私は最後にそれを実現するための実験をしました。申し訳ありません
cafebabe1991

18

request.session 他の辞書と同じように、属性とメンバーには通常のテンプレートメカニズムを使用します。

{{ request.session.name }}

要求をテンプレートコンテキストに渡すことを忘れないでください。または、RequestContextを使用していて、要求コンテキストプロセッサが有効になっていることを確認してください。ドキュメントを参照してください。


11

私はDjango 1.9(2016年3月)を使用していて{{ request.session.name}}、作業を開始するために、私の設定は次のようになっています。

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [],
    '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',
            ],
        },
    },
]

前回の回答との違いは次のとおりです。'django.core.context_processors.request'となりました'django.template.context_processors.request'


2
Django 1.10では、django.template.context_processors.request設定ファイルに既に含まれていました:D
Thai Tran

6

あなたはrequestテンプレートに変数を渡すことができ、そこで使用します:

{{ request.session.name }}

2

最初に印刷してrequest.session.keys()から

request.session['_auth_user_id']
request.session['_auth_user_backend']

これらの2つのセッション変数を取得します。


2

最も単純な実装はifループを使用しています:

{% if 'data' in request.session %}

1

あなたのsettins.pyで

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request',
)

あなたの見解は、おそらくこのようになります。

from django.shortcuts import render_to_response, render
from django.http import HttpResponse, HttpResponseRedirect
from django.template import RequestContext

@login_required()
def index_admin(request):
    return render_to_response('carteras/index_admin.html', {}, context_instance=RequestContext(request))

また、「django.contrib.auth.context_processors.auth」をTEMPLATE_CONTEXT_PROCESSORSタプルに追加する必要がありました。
トニー・

1

@Ludwik Trammerの回答、TEMPLATE_CONTEXT_PROCESSORSの追加方法の続き

django 1.6の場合、settings.pyで、以下のコードを参照するTEMPLATE_CONTEXT_PROCESSORSを追加し{{ request.session.name }}、テンプレートファイルで使用します。

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.core.context_processors.tz",
"django.contrib.messages.context_processors.messages",
"django.core.context_processors.request")

リファレンスhttps://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS

Plsは、設定でその完全なコードを使用する必要があることに注意してください。"django.core.context_processors.request"単独で使用すると、デフォルト設定が上書きされます。


0

もう少し遅すぎるかもしれません。で直接設定TEMPLATE_CONTEXT_PROCESSORSするとsettings.py、すべてのデフォルトTEMPLATE_CONTEXT_PROCESSORS値が失われます。これが私が私の中で行うことですsettings.py

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as DEFAULT_TEMPLATE_CONTEXT_PROCESSORS

TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_TEMPLATE_CONTEXT_PROCESSORS + (
    'django.core.context_processors.request',
)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.