Django: bir şablon içinden oturum değişkenlerine erişmek?


133

Django'da aşağıdaki gibi bir oturum değişkeni ayarlarsam:

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

Ona bir şablon içinden erişebilmemin bir yolu var mı, yoksa onu bir görünümden alıp bir şablona geçirmem mi gerekiyor?

Bir şablon içinde erişmek istediğim yaklaşık 10 küçük oturum değişkenine sahip olduğum için sormak ve görünümden şablona 10 tanesinin tümünü geçirmek biraz karışık olabilir.

(Oturum değişkenlerini kullanmak zorundayım çünkü bu bir HttpResponseRedirect, ancak değişkenleri bir veritabanında depolamak, benim amaçlarım için gereğinden fazla.)

Yani - oturum değişkenlerini doğrudan bir şablon içinden almanın bir yolu var mı?

Yanıtlar:


224

Sen eklemeniz gerekir django.core.context_processors.requestsizin için şablon bağlam işlemciler . Sonra bunlara şu şekilde erişebilirsiniz:

{{ request.session.name }}

Özel görünümler kullanıyorsanız, bir RequestContext örneğini geçirdiğinizden emin olun. Belgelerden alınan örnek :

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 Güncellemesi: Bu cevap için hala aldığım olumlu oylara bakılırsa, insanlar hala yazıldıktan üç yıldan fazla bir süre sonra yararlı buluyorlar. Bununla birlikte, yukarıdaki görünüm kodu hala geçerli olmasına rağmen, günümüzde bunu yapmanın çok daha basit bir yolu olduğunu lütfen unutmayın. render()şuna çok benzeyen bir işlevdir render_to_response(), ancak RequestContextaçıkça iletilmesine gerek kalmadan otomatik olarak kullanır :

from django.shortcuts import render

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

9
Varsayılanları geçersiz kılmadan şablon bağlam işlemcilerinize django.core.context_processors.request'i nasıl ekleyeceğinizi öğrenmek için stackoverflow.com/questions/2246725/… sayfasına bakın .
Rick Westera

Render yerine HttpResponse kullanırsam, şablonumdaki oturum özniteliğini yine de alabilir miyim? Kafam karıştı, lütfen söyleyin
cafebabe1991

@ cafebabe1991 Ne demek istiyorsun? HttpResponseSorusu, ilgili ... görünmüyor böylece sınıf, hiç şablonlarla uğraşmaz
Ludwik trammer

Evet, aslında sonunda bunu anlamak için bir deney yaptım. Kötü soru. üzgünüm
cafebabe1991

18

request.session diğerleri gibi bir sözlüktür, bu nedenle nitelikler ve üyeler için sadece normal şablon mekanizmasını kullanırsınız:

{{ request.session.name }}

İsteği şablon bağlamına aktarmayı veya daha da iyisi RequestContext'i kullandığınızdan ve istek bağlamı işlemcisini etkinleştirdiğinizden emin olun. Belgelere bakın .


11

Django 1.9 (Mart 2016) kullanıyorum ve {{ request.session.name}}işe başlamak için ayarlarım şu:

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

Önceki cevaplardan farktır: 'django.core.context_processors.request'oldu'django.template.context_processors.request'


2
Django 1.10'da django.template.context_processors.requestzaten ayar dosyasındaydı: D
Thai Tran

6

Bir requestdeğişkeni bir şablona aktarabilirsiniz ve orada kullanın:

{{ request.session.name }}

2

Önce yazdır request.session.keys()sonra

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

Bu iki oturum değişkenini alacaksınız.


2

en basit uygulama if döngüsünü kullanmaktır:

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

1

Yerleşimlerinizde.py

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

Sizin görüşünüz belki buna benziyor.

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

Ayrıca TEMPLATE_CONTEXT_PROCESSORS demetine 'django.contrib.auth.context_processors.auth' eklemem gerekiyordu.
Tony

1

Devam ediyor @Ludwik Trammer yanıtı, TEMPLATE_CONTEXT_PROCESSORS nasıl eklenir?

Django 1.6 için, settings.py içinde aşağıdaki kodu referans alan TEMPLATE_CONTEXT_PROCESSORS ekleyin ve ardından {{ request.session.name }}şablon dosyalarında kullanın .

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

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

Pls, bu kodun tamamını ayarlarda kullanmanız gerektiğini unutmayın. Tek "django.core.context_processors.request"başına kullanılması varsayılan ayarların geçersiz kılınmasına neden olacaktır.


0

Belki artık çok geç. Doğrudan ayarlarsanız TEMPLATE_CONTEXT_PROCESSORSiçinde settings.py, tüm varsayılan kaybedersiniz TEMPLATE_CONTEXT_PROCESSORSdeğer. İşte yaptığım şey 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',
)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.