Django: การเข้าถึงตัวแปรเซสชันจากภายในเทมเพลต?


134

หากฉันตั้งค่าตัวแปรเซสชันใน Django เช่น:

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

มีวิธีใดบ้างที่ฉันสามารถเข้าถึงได้จากภายในเทมเพลตหรือฉันต้องดึงข้อมูลจากภายในมุมมองจากนั้นจึงส่งต่อไปยังเทมเพลต

การถามเนื่องจากฉันมีตัวแปรเซสชันเพียงเล็กน้อยประมาณ 10 ตัวที่ฉันต้องการเข้าถึงภายในเทมเพลตและการส่งทั้ง 10 จากมุมมองไปยังเทมเพลตอาจทำให้ยุ่งเล็กน้อย

(ฉันต้องใช้ตัวแปรเซสชันเพราะเป็น HttpResponseRedirect แต่การจัดเก็บตัวแปรในฐานข้อมูลนั้นเกินความจำเป็นสำหรับวัตถุประสงค์ของฉัน)

ดังนั้น - มีวิธีใดในการคว้าตัวแปรเซสชันโดยตรงภายในเทมเพลตหรือไม่?

คำตอบ:


228

คุณต้องเพิ่ม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: การตัดสินโดยการโหวตเพิ่มที่ฉันยังคงได้รับสำหรับคำตอบนี้ผู้คนยังคงพบว่ามันเป็นประโยชน์มากกว่าสามปีหลังจากที่เขียนครั้งแรก อย่างไรก็ตามโปรดทราบว่าแม้ว่ารหัสมุมมองด้านบนจะยังคงใช้ได้ แต่ในปัจจุบันมีวิธีที่ง่ายกว่านี้มาก render()เป็นฟังก์ชั่นที่คล้ายกันมากrender_to_response()แต่ใช้RequestContextโดยอัตโนมัติโดยไม่จำเป็นต้องส่งอย่างชัดเจน:

from django.shortcuts import render

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

10
ดูstackoverflow.com/questions/2246725/…สำหรับวิธีการเพิ่ม django.core.context_processors.request ให้กับตัวประมวลผลบริบทเทมเพลตของคุณโดยไม่ลบล้างค่าเริ่มต้น
Rick Westera

หากฉันใช้ HttpResponse แทนการเรนเดอร์ฉันจะยังสามารถรับแอตทริบิวต์เซสชันในเทมเพลตของฉันได้ฉันสับสนโปรดบอกฉันที
cafebabe1991

@ cafebabe1991 หมายความว่าไง? HttpResponseชั้นไม่ได้จัดการกับแม่แบบที่ทุกคนดังนั้นคำถามดูเหมือนจะไม่เกี่ยวข้อง ...
Ludwik trammer

ใช่จริงๆแล้วฉันได้ทำการทดลองเพื่อให้รู้ว่าในตอนท้ายคำถามไม่ดี ขอโทษ
cafebabe1991

18

request.session เป็นพจนานุกรมที่เหมือนกับที่อื่น ๆ ดังนั้นคุณเพียงแค่ใช้กลไกเทมเพลตปกติสำหรับแอตทริบิวต์และสมาชิก:

{{ request.session.name }}

อย่าลืมส่งคำขอไปยังบริบทเทมเพลตหรือให้แน่ใจว่าคุณกำลังใช้ RequestContext และเปิดใช้งานตัวประมวลผลบริบทคำขอ ดูเอกสาร


12

ฉันใช้ Django 1.9 (มีนาคม 2016) และเพื่อ{{ 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'become'django.template.context_processors.request'


2
ใน Django 1.10 ไฟล์django.template.context_processors.requestนั้นอยู่ในไฟล์การตั้งค่าแล้ว: D
Thai Tran




1

ในการตั้งถิ่นฐานของคุณ

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
Tony

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

โปรดทราบว่าคุณควรใช้รหัสที่สมบูรณ์ในการตั้งค่า การใช้"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.