জাঙ্গো: একটি টেম্পলেট থেকে সেশন ভেরিয়েবল অ্যাক্সেস?


133

যদি আমি জ্যাঙ্গোতে একটি সেশন ভেরিয়েবল সেট করি তবে:

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

টেমপ্লেটের মধ্যে থেকে আমি কীভাবে এটি অ্যাক্সেস করতে পারি, বা আমাকে কোনও ভিউয়ের মধ্যে থেকে এটি পুনরুদ্ধার করতে হবে, এবং তারপরে এটি কোনও টেমপ্লেটে পাস করতে হবে?

জিজ্ঞাসা করা হচ্ছে কারণ আমার কাছে প্রায় 10 টি ছোট সেশন ভেরিয়েবল রয়েছে যা আমি কোনও টেমপ্লেটের মধ্যে অ্যাক্সেস করতে চাই এবং সমস্ত 10 টি ভিউ থেকে টেমপ্লেটে পাস করা কিছুটা অগোছালো হতে পারে।

(আমাকে সেশন ভেরিয়েবলগুলি ব্যবহার করতে হবে কারণ এটি একটি HTTPResponseRedirect, কিন্তু একটি ডাটাবেসে ভেরিয়েবলগুলি সংরক্ষণ করা আমার উদ্দেশ্যগুলির জন্য ওভারকিল)

সুতরাং - কোনও টেম্পলেটের মধ্যে সেশন ভেরিয়েবলগুলি সরাসরি ধরার কোনও উপায়?

উত্তর:


224

django.core.context_processors.requestআপনাকে আপনার টেম্পলেট প্রসঙ্গ প্রসেসরের সাথে যুক্ত করতে হবে । তারপরে আপনি এগুলিতে এগুলি অ্যাক্সেস করতে পারবেন:

{{ request.session.name }}

আপনি যদি কাস্টম দর্শন ব্যবহার করছেন তবে নিশ্চিত হয়ে নিন যে আপনি একটি অনুরোধসূচী দৃষ্টান্তটি পাস করছেন। ডকুমেন্টেশন থেকে নেওয়া উদাহরণ :

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

আপডেট ২০১৩: আমি এখনও এই উত্তরটির জন্য যে উত্সগুলি পেয়েছি তা বিচার করে লোকেরা এখনও এটি সহায়ক হিসাবে খুঁজে পাচ্ছে, মূলত এটি লেখার তিন বছরেরও বেশি সময় পরে। তবে দয়া করে নোট করুন, যদিও উপরে ভিউ কোডটি এখনও বৈধ, আজকাল এটি করার অনেক সহজ উপায় রয়েছে is render()এর সাথে একই রকম একটি ফাংশন হয় render_to_response()তবে RequestContextএটি স্পষ্টভাবে পাস করার প্রয়োজন ছাড়াই এটি স্বয়ংক্রিয়ভাবে ব্যবহার করে:

from django.shortcuts import render

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

9
দেখুন stackoverflow.com/questions/2246725/... কিভাবে অক্ষমতা অগ্রাহ্য ছাড়া আপনার টেমপ্লেট প্রসঙ্গ প্রসেসর থেকে django.core.context_processors.request যোগ করার জন্য।
রিক ওয়েস্টেরার

আমি যদি রেন্ডারের পরিবর্তে এইচটিপিআরস্পোন ব্যবহার করি তবে আমি এখনও আমার টেমপ্লেটে সেশনটির বৈশিষ্ট্য পেতে সক্ষম হব। আমি বিভ্রান্ত হয়েছি দয়া করে আমাকে বলুন
ক্যাফেবাবে ১৯৯৯

@ Cafebabe1991 আপনার মানে কি? HttpResponseবর্গ এ সব টেমপ্লেট সঙ্গে মোকাবিলা না, তাই প্রশ্ন প্রাসঙ্গিক ... মনে হচ্ছে না
Ludwik ট্রাম চালক

হ্যাঁ, প্রকৃতপক্ষে আমি বুঝতে পেরেছিলাম একটি পরীক্ষার শেষে B খারাপ প্রশ্ন। দুঃখিত
ক্যাফেবা 1919

18

request.session অন্য যে কোনও অভিধানের মতো অভিধান, তাই আপনি গুণাবলী এবং সদস্যদের জন্য সাধারণ টেম্পলেট পদ্ধতিটি ব্যবহার করেন:

{{ request.session.name }}

অনুরোধটি টেমপ্লেট প্রসঙ্গে পাস করতে ভুলবেন না, বা আরও ভালভাবে নিশ্চিত করুন যে আপনি অনুরোধ কনটেক্সট ব্যবহার করছেন এবং অনুরোধ প্রসঙ্গে প্রসেসর সক্ষম করেছেন। ডকুমেন্টেশন দেখুন ।


11

আমি জ্যাঙ্গো ১.৯ (মার্চ ২০১ 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'হয়ে গেছে'django.template.context_processors.request'


2
জাজানো ১.১০ তে, django.template.context_processors.requestসেটিং ফাইলে ইতিমধ্যে ছিল: ডি
থাই ট্রান

6

আপনি requestকোনও টেম্পলেটে একটি ভেরিয়েবল পাস করতে পারেন এবং সেখানে ব্যবহার করতে পারেন:

{{ request.session.name }}

2

request.session.keys()তারপরে প্রথমে প্রিন্ট করুন

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

আপনি এই দুটি সেশন ভেরিয়েবল পাবেন।


2

লুপটি ব্যবহার করলে সবচেয়ে সহজ প্রয়োগ হচ্ছে:

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

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 টিপলে যোগ করতে হয়েছিল।
টনি

1

অবিরত @ লুড্বিক ট্রামারের উত্তর, কীভাবে যুক্ত করবেন TEMPLATE_CONTEXT_PROCESSORS

Django 1.6 এর জন্য, সেটিংসে। নীচের কোডটি উল্লেখ করে 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.