Django: mengakses variabel sesi dari dalam templat?

133

Jika saya menetapkan variabel sesi dalam Django, seperti:

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

Apakah ada cara saya dapat mengaksesnya dari dalam templat, atau apakah saya harus mengambilnya dari dalam tampilan, lalu meneruskannya ke templat?

Bertanya karena saya memiliki sekitar 10 variabel sesi kecil yang ingin saya akses di dalam templat, dan meneruskan semua 10 dari tampilan ke templat bisa menjadi sedikit berantakan.

(Saya harus menggunakan variabel sesi karena itu adalah HttpResponseRedirect, tetapi menyimpan variabel dalam database berlebihan untuk tujuan saya.)

Jadi - ada cara untuk mengambil variabel sesi langsung di dalam templat?

AP257
sumber

Jawaban:

224

Anda perlu menambahkan django.core.context_processors.requestke prosesor konteks template Anda . Maka Anda dapat mengaksesnya seperti ini:

{{ request.session.name }}

Jika Anda menggunakan tampilan khusus, pastikan Anda mengirimkan instance RequestContext. Contoh diambil dari dokumentasi :

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

Pembaruan 2013: Menilai dari upvotes yang masih saya terima untuk jawaban ini, orang masih merasa terbantu, lebih dari tiga tahun setelah awalnya ditulis. Harap perhatikan bahwa meskipun kode tampilan di atas masih valid, saat ini ada cara yang lebih sederhana untuk melakukan ini. render()adalah fungsi yang sangat mirip dengan render_to_response(), tetapi menggunakan RequestContextsecara otomatis, tanpa harus meneruskannya secara eksplisit:

from django.shortcuts import render

def some_view(request):
    # ...
    return render(request, 'my_template.html', my_data_dictionary)
Ludwik Trammer
sumber
9
Lihat stackoverflow.com/questions/2246725/... untuk cara menambahkan django.core.context_processors.request ke pemroses konteks template Anda tanpa mengesampingkan default.
Rick Westera
jika saya menggunakan HttpResponse sebagai ganti render, apakah saya masih bisa mendapatkan atribut sesi di templat saya. Saya bingung, tolong beri tahu saya
cafebabe1991
@ cafebabe1991 Apa maksudmu? The HttpResponsekelas tidak berurusan dengan template sama sekali, jadi pertanyaannya tampaknya tidak relevan ...
Ludwik pengemudi trem
Ya, sebenarnya saya melakukan percobaan untuk menyadari hal itu pada akhirnya. Pertanyaan buruk. maaf
cafebabe1991
18

request.session adalah kamus seperti kamus lainnya, jadi Anda cukup menggunakan mekanisme templat normal untuk atribut dan anggota:

{{ request.session.name }}

Jangan lupa untuk mengirimkan permintaan ke dalam konteks templat, atau bahkan lebih baik memastikan Anda menggunakan RequestContext dan mengaktifkan prosesor konteks permintaan. Lihat dokumentasi .

Daniel Roseman
sumber
11

Saya menggunakan Django 1.9 (Maret 2016) dan untuk mulai {{ request.session.name}}bekerja, pengaturan saya punya ini ::

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',
            ],
        },
    },
]

Perbedaan dari jawaban sebelumnya adalah: 'django.core.context_processors.request'menjadi'django.template.context_processors.request'

lunamystry
sumber
2
dalam Django 1.10, django.template.context_processors.requestsudah ada dalam file pengaturan: D
Thai Tran
6

Anda bisa mengirimkan requestvariabel ke templat dan menggunakan:

{{ request.session.name }}
Cahaya Perak
sumber
2

Cetak request.session.keys()dulu

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

Anda akan mendapatkan dua variabel sesi ini.

Namita Maharanwar
sumber
2

implementasi paling sederhana adalah menggunakan if loop:

{% if 'data' in request.session %}
cryptoKTM
sumber
1

Di settins.py Anda

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

Pandangan Anda, mungkin terlihat seperti ini.

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))
Pjl
sumber
Saya juga harus menambahkan 'django.contrib.auth.context_processors.auth' ke tuple TEMPLATE_CONTEXT_PROCESSORS.
Tony
1

Melanjutkan jawaban Trammer @Ludwik, Bagaimana cara menambahkan TEMPLATE_CONTEXT_PROCESSORS

Untuk django 1.6, di settings.py tambahkan TEMPLATE_CONTEXT_PROCESSORS merujuk kode di bawah ini dan kemudian gunakan {{ request.session.name }}dalam file template.

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")

Referensi https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS

Harap perhatikan bahwa, Anda harus menggunakan kode lengkap itu dalam pengaturan. Menggunakannya "django.core.context_processors.request"sendiri akan menghasilkan mengesampingkan pengaturan default.

Sree
sumber
0

Mungkin agak terlambat sekarang. Jika Anda langsung TEMPLATE_CONTEXT_PROCESSORSmasuk settings.py, Anda akan kehilangan semua TEMPLATE_CONTEXT_PROCESSORSnilai default . Inilah yang saya lakukan di 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',
)
rabbit.aaron
sumber