Django: truy cập các biến phiên từ trong một mẫu?


133

Nếu tôi đặt biến phiên trong Django, như:

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

Có cách nào để tôi có thể truy cập nó từ trong một mẫu hay tôi phải truy xuất nó từ trong một khung nhìn, và sau đó chuyển nó vào một mẫu?

Hỏi bởi vì tôi có khoảng 10 biến số phiên nhỏ mà tôi muốn truy cập trong một mẫu và việc chuyển tất cả 10 từ chế độ xem sang mẫu có thể hơi lộn xộn.

(Tôi phải sử dụng các biến phiên vì đó là một httpResponseRedirect, nhưng việc lưu trữ các biến trong cơ sở dữ liệu là quá mức cho mục đích của tôi.)

Vì vậy - bất kỳ cách nào để lấy các biến phiên trực tiếp trong một mẫu?

Câu trả lời:


224

Bạn cần thêm django.core.context_processors.requestvào bộ xử lý bối cảnh mẫu của bạn . Sau đó, bạn có thể truy cập chúng như thế này:

{{ request.session.name }}

Trong trường hợp bạn đang sử dụng chế độ xem tùy chỉnh, hãy đảm bảo rằng bạn đang truyền một thể hiện RequestContext. Ví dụ lấy từ tài liệu :

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

Cập nhật 2013: Đánh giá theo các upvote tôi vẫn nhận được câu trả lời này, mọi người vẫn thấy nó hữu ích, hơn ba năm sau khi nó được viết ban đầu. Tuy nhiên, xin lưu ý rằng mặc dù mã xem ở trên vẫn còn hiệu lực, nhưng ngày nay có một cách đơn giản hơn nhiều để thực hiện việc này. render()là một chức năng rất giống với render_to_response(), nhưng nó sử dụng RequestContexttự động, không cần phải vượt qua nó một cách rõ ràng:

from django.shortcuts import render

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

9
Xem stackoverflow.com/questions/2246725/ trên để biết cách thêm django.core.context_ Processors.request vào bộ xử lý bối cảnh mẫu của bạn mà không ghi đè mặc định.
Rick Westera

Nếu tôi sử dụng HttpResponse thay vì kết xuất, tôi vẫn có thể nhận được thuộc tính phiên trong mẫu của mình. Tôi bối rối xin vui lòng cho tôi biết
cafebabe1991

@ cafebabe1991 Ý bạn là gì? Các HttpResponselớp không đối phó với các mẫu ở tất cả, vì vậy câu hỏi dường như không có liên quan ...
Ludwik người đẩy xe

Ya, thực sự tôi đã làm một thí nghiệm để nhận ra rằng ở cuối câu hỏi. xin lỗi
cafebabe1991

18

request.session là một từ điển như mọi thứ khác, vì vậy bạn chỉ cần sử dụng cơ chế mẫu bình thường cho các thuộc tính và thành viên:

{{ request.session.name }}

Đừng quên chuyển yêu cầu vào ngữ cảnh mẫu hoặc thậm chí tốt hơn là đảm bảo bạn đang sử dụng RequestContext và bật bộ xử lý ngữ cảnh yêu cầu. Xem tài liệu .


11

Tôi đang sử dụng Django 1.9 (tháng 3 năm 2016) và để đi {{ request.session.name}}làm, cài đặt của tôi có ::

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

Sự khác biệt so với các câu trả lời trước là: 'django.core.context_processors.request'đã trở thành'django.template.context_processors.request'


2
trong Django 1.10, django.template.context_processors.requestđã có trong tệp cài đặt: D
Thai Tran

6

Bạn có thể truyền một requestbiến cho một mẫu và sử dụng:

{{ request.session.name }}

2

Đầu tiên in request.session.keys()rồi

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

Bạn sẽ nhận được hai biến phiên này.


2

cách thực hiện đơn giản nhất là sử dụng vòng lặp if:

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

1

Trong khu định cư của bạn

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

Quan điểm của bạn, có thể trông như thế này.

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

Tôi cũng đã phải thêm 'django.contrib.auth.context_ Processors.auth' vào tuple TEMPLATE_CONTEXT_PROCESSORS.
Tony

1

Tiếp tục câu trả lời @Ludwik Trammer, Cách thêm TEMPLATE_CONTEXT_PROCESSORS

Đối với django 1.6, trong settings.txt thêm TEMPLATE_CONTEXT_PROCESSORS tham chiếu mã bên dưới và sau đó sử dụng {{ request.session.name }}trong các tệp mẫu.

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

Tham khảo https://docs.djangoproject.com/en/1.6/ref/sinstall/#std:setting-TEMPLATE_CONTEXT_PROCESSORS

Xin lưu ý rằng, bạn nên sử dụng mã hoàn chỉnh đó trong cài đặt. Sử dụng "django.core.context_processors.request"một mình sẽ dẫn đến ghi đè cài đặt mặc định.


0

Có lẽ hơi muộn rồi. Nếu bạn trực tiếp đặt TEMPLATE_CONTEXT_PROCESSORStrong settings.py, bạn sẽ mất tất cả mặc định TEMPLATE_CONTEXT_PROCESSORSgiá trị. Đây là những gì tôi làm trong 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',
)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.