আমার সেটিংস.পি-তে কিছু জিনিস রয়েছে যা আমি কোনও টেমপ্লেট থেকে অ্যাক্সেস করতে সক্ষম হতে চাই তবে কীভাবে এটি করব তা আমি বুঝতে পারি না। আমি ইতিমধ্যে চেষ্টা করেছি
{{CONSTANT_NAME}}
কিন্তু এটি কাজ করে না বলে মনে হচ্ছে। এটা কি সম্ভব?
আমার সেটিংস.পি-তে কিছু জিনিস রয়েছে যা আমি কোনও টেমপ্লেট থেকে অ্যাক্সেস করতে সক্ষম হতে চাই তবে কীভাবে এটি করব তা আমি বুঝতে পারি না। আমি ইতিমধ্যে চেষ্টা করেছি
{{CONSTANT_NAME}}
কিন্তু এটি কাজ করে না বলে মনে হচ্ছে। এটা কি সম্ভব?
উত্তর:
জ্যাঙ্গো নির্দিষ্ট, প্রায়শই ব্যবহৃত সেটিংসের টেমপ্লেটগুলিতে অ্যাক্সেস সরবরাহ করে যেমন settings.MEDIA_URL
কিছু ভাষা সেটিং এবং যদি আপনি জেনারিক ভিউতে জঞ্জোর অন্তর্নির্মিত ব্যবহার করেন বা render_to_response
শর্টকাট ফাংশনে একটি প্রসঙ্গ উদাহরণ কীওয়ার্ড আর্গুমেন্টে পাস করেন । প্রতিটি মামলার উদাহরণ এখানে:
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.views.generic.simple import direct_to_template
def my_generic_view(request, template='my_template.html'):
return direct_to_template(request, template)
def more_custom_view(request, template='my_template.html'):
return render_to_response(template, {}, context_instance=RequestContext(request))
এই মতামতগুলির উভয়টিতে বেশিরভাগ ঘন ঘন ব্যবহৃত সেটিংস settings.MEDIA_URL
যেমন টেম্পলেটটিতে উপলভ্য {{ MEDIA_URL }}
ইত্যাদি থাকবে etc.
আপনি যদি সেটিংসে অন্য ধ্রুবকগুলিতে অ্যাক্সেসের সন্ধান করছেন তবে কেবল আপনার পছন্দসই ধ্রুবকগুলি আনপ্যাক করুন এবং আপনার ভিউ ফাংশনে আপনি যে প্রাসঙ্গিক অভিধানটি ব্যবহার করছেন তাতে এগুলি যুক্ত করুন:
from django.conf import settings
from django.shortcuts import render_to_response
def my_view_function(request, template='my_template.html'):
context = {'favorite_color': settings.FAVORITE_COLOR}
return render_to_response(template, context)
এখন আপনি settings.FAVORITE_COLOR
আপনার টেম্পলেটটিতে অ্যাক্সেস করতে পারেন {{ favorite_color }}
।
django-settings-export
যে দৃশ্য এই কোড লিখতে প্রয়োজন এড়ানো।
আপনি যদি প্রতিটি অনুরোধ এবং টেম্পলেটটির জন্য এটির মান রাখতে চান তবে একটি প্রসঙ্গ প্রসেসর ব্যবহার করা আরও উপযুক্ত।
এখানে কীভাবে:
context_processors.py
আপনার অ্যাপ ডিরেক্টরিতে একটি ফাইল তৈরি করুন । আসুন বলি যে আমি ADMIN_PREFIX_VALUE
প্রতিটি প্রসঙ্গে মূল্য রাখতে চাই :
from django.conf import settings # import the settings file
def admin_media(request):
# return the value you want as a dictionnary. you may add multiple values in there.
return {'ADMIN_MEDIA_URL': settings.ADMIN_MEDIA_PREFIX}
আপনার সেটিংস.পি ফাইলটিতে আপনার প্রসঙ্গ প্রসেসর যুক্ত করুন:
TEMPLATES = [{
# whatever comes before
'OPTIONS': {
'context_processors': [
# whatever comes before
"your_app.context_processors.admin_media",
],
}
}]
RequestContext
আপনার টেমপ্লেটে আপনার প্রসঙ্গ প্রসেসর যুক্ত করতে আপনার দৃষ্টিতে ব্যবহার করুন। render
শর্টকাট এই স্বয়ংক্রিয়ভাবে আছে:
from django.shortcuts import render
def my_view(request):
return render(request, "index.html")
এবং অবশেষে, আপনার টেমপ্লেটে:
...
<a href="{{ ADMIN_MEDIA_URL }}">path to admin media</a>
...
context_process.py
আমার settings.py
ফাইলের ঠিক পাশে রেখেছি এবং "context_processors.admin_media"
আমার TEMPLATE_CONTEXT_PROCESSORS
তালিকায় যুক্ত করেছি । এছাড়াও, আপনি এই সত্যটি সম্পর্কে আপনার উত্তরে একটি নোট যুক্ত করতে চাইতে পারেন যে TEMPLATE_CONTEXT_PROCESSORS এর ডিফল্ট মানটি খালি নয়, সুতরাং যদি কোনও বিদ্যমান কোড যদি সেই ডিফল্ট প্রসঙ্গ প্রসেসরের দ্বারা নির্ধারিত মানগুলির কোনও ব্যবহার করে, তবে আপনি যদি তাদের আবার না যোগ করেন তবে সেগুলি কাজ করবে না স্পষ্টভাবে তালিকায়।
render
জাঙ্গো ১.৩ অনুসারে, আপনি স্পষ্টভাবে অনুরোধকন্টেক্সট: ডকস.ডজ্যাঙ্গোপ্রজেক্ট
আমি একক কাস্টম টেম্পলেট ট্যাগ হওয়ায় সবচেয়ে সহজ পদ্ধতির সন্ধান পেয়েছি :
from django import template
from django.conf import settings
register = template.Library()
# settings value
@register.simple_tag
def settings_value(name):
return getattr(settings, name, "")
ব্যবহার:
{% settings_value "LANGUAGE_CODE" %}
{% settings_value "DATABASES" %}
? এই ব্যবহারের ক্ষেত্রে এটি স্পষ্ট করে তুলতে হবে যে কেন শুরু হতে টেমপ্লেটে সেটিংস উপলব্ধ নেই।
templatetags
আপনার অ্যাপ্লিকেশনের মধ্যে একটি খালি __init__.py
ফাইল এবং এই কোডটিকে সেই ফোল্ডারের অভ্যন্তরে একটি ফোল্ডার তৈরি করতে হবে settings.py
। 2) আপনার টেম্পলেটটিতে আপনি যুক্ত করুন {% load settings %}
এবং তারপরে আপনার নতুন ট্যাগটি ব্যবহার করুন!
চেক আউট django-settings-export
(অস্বীকৃতি: আমি এই প্রকল্পের লেখক)।
উদাহরণ স্বরূপ...
$ pip install django-settings-export
TEMPLATES = [
{
'OPTIONS': {
'context_processors': [
'django_settings_export.settings_export',
],
},
},
]
MY_CHEESE = 'Camembert';
SETTINGS_EXPORT = [
'MY_CHEESE',
]
<script>var MY_CHEESE = '{{ settings.MY_CHEESE }}';</script>
render
এবং নাrender_to_response
এটি করার আরেকটি উপায় হ'ল একটি কাস্টম টেমপ্লেট ট্যাগ তৈরি করা যা আপনাকে সেটিংসের বাইরে মানগুলি ফিশ করতে দেয়।
@register.tag
def value_from_settings(parser, token):
try:
# split_contents() knows not to split quoted strings.
tag_name, var = token.split_contents()
except ValueError:
raise template.TemplateSyntaxError, "%r tag requires a single argument" % token.contents.split()[0]
return ValueFromSettings(var)
class ValueFromSettings(template.Node):
def __init__(self, var):
self.arg = template.Variable(var)
def render(self, context):
return settings.__getattr__(str(self.arg))
তারপরে আপনি এটি ব্যবহার করতে পারেন:
{% value_from_settings "FQDN" %}
কনটেক্সট-প্রসেসরের হুপের মাধ্যমে ঝাঁপিয়ে না ফেলে এটিকে কোনও পৃষ্ঠায় মুদ্রণ করতে।
আমি বেরিস্লাভের সমাধানটি পছন্দ করি কারণ সহজ সাইটগুলিতে এটি পরিষ্কার এবং কার্যকর। আমি যা পছন্দ করি না তা হ'ল সমস্ত সেটিংসের কনস্ট্যান্টগুলি উইলি-নিলির বহিঃপ্রকাশ। সুতরাং আমি যা করে শেষ করেছি তা হ'ল:
from django import template
from django.conf import settings
register = template.Library()
ALLOWABLE_VALUES = ("CONSTANT_NAME_1", "CONSTANT_NAME_2",)
# settings value
@register.simple_tag
def settings_value(name):
if name in ALLOWABLE_VALUES:
return getattr(settings, name, '')
return ''
ব্যবহার:
{% settings_value "CONSTANT_NAME_1" %}
এটি কোনও ধরণের প্রতিরোধকে সুরক্ষা দেয় যা আপনি টেম্পলেটটিতে ব্যবহার থেকে নাম প্রকাশ করেন নি এবং আপনি যদি সত্যিই অভিনব হতে চান তবে আপনি সেটিংসে একটি টিপল সেট করতে পারেন এবং বিভিন্ন পৃষ্ঠা, অ্যাপস বা অঞ্চলগুলির জন্য একাধিক টেমপ্লেট ট্যাগ তৈরি করতে পারেন এবং সহজভাবে প্রয়োজন অনুসারে স্থানীয় টিউপলকে সেটিংস টিপলটির সাথে একত্রিত করুন, তারপরে মানটি গ্রহণযোগ্য কিনা তা দেখার জন্য তালিকা বোধগম্য করুন।
আমি একমত, একটি জটিল সাইটে, এটি কিছুটা সরল, তবে এমন মান রয়েছে যা সর্বজনীনভাবে টেমপ্লেটগুলিতে রাখা ভাল, এবং এটি দুর্দান্তভাবে কাজ করে বলে মনে হয়। আসল ধারণাটির জন্য বার্লিসালাকে ধন্যবাদ!
if name in ALLOWABLE_VALUES: ...
'val' in ('val_first', 'second_val',)
হচ্ছেন তার জন্য কেবল স্পষ্ট করে বলা: এটি False
এখানে কোনও স্ট্রাস্টিং সমস্যা নেই।
if
বিবৃতিতে ব্যবহার করতে পারি ? আমি DEBUG
মানটি যাচাই করতে চাই
আমি ক্রিসডিউর উত্তর উন্নত করেছি (আপনার নিজের ট্যাগ তৈরি করতে) কিছুটা ।
প্রথমে, ফাইলটি তৈরি করুন yourapp/templatetags/value_from_settings.py
যেখানে আপনি নিজের নতুন ট্যাগটি সংজ্ঞায়িত করেছেন value_from_settings
:
from django.template import TemplateSyntaxError, Variable, Node, Variable, Library
from yourapp import settings
register = Library()
# I found some tricks in URLNode and url from defaulttags.py:
# https://code.djangoproject.com/browser/django/trunk/django/template/defaulttags.py
@register.tag
def value_from_settings(parser, token):
bits = token.split_contents()
if len(bits) < 2:
raise TemplateSyntaxError("'%s' takes at least one " \
"argument (settings constant to retrieve)" % bits[0])
settingsvar = bits[1]
settingsvar = settingsvar[1:-1] if settingsvar[0] == '"' else settingsvar
asvar = None
bits = bits[2:]
if len(bits) >= 2 and bits[-2] == 'as':
asvar = bits[-1]
bits = bits[:-2]
if len(bits):
raise TemplateSyntaxError("'value_from_settings' didn't recognise " \
"the arguments '%s'" % ", ".join(bits))
return ValueFromSettings(settingsvar, asvar)
class ValueFromSettings(Node):
def __init__(self, settingsvar, asvar):
self.arg = Variable(settingsvar)
self.asvar = asvar
def render(self, context):
ret_val = getattr(settings,str(self.arg))
if self.asvar:
context[self.asvar] = ret_val
return ''
else:
return ret_val
আপনি এই টেম্পলেটটিতে এই ট্যাগটি এর মাধ্যমে ব্যবহার করতে পারেন:
{% load value_from_settings %}
[...]
{% value_from_settings "FQDN" %}
বা মাধ্যমে
{% load value_from_settings %}
[...]
{% value_from_settings "FQDN" as my_fqdn %}
as ...
স্বরলিপিটির সুবিধা হ'ল এটি blocktrans
একটি সাধারণ মাধ্যমে ব্লকে ব্যবহার করা সহজ করে তোলে {{my_fqdn}}
।
জ্যাঙ্গো ২.০+ সহ এটির সমাধান করে এমন একটি কাস্টম টেম্পলেট ট্যাগ তৈরির জন্য সম্পূর্ণ নির্দেশাবলীর সাথে একটি উত্তর যুক্ত করা
আপনার অ্যাপ-ফোল্ডারে, টেম্পলেটট্যাগগুলি নামে একটি ফোল্ডার তৈরি করুন । এটিতে __init__.py এবং কাস্টম_ট্যাগস.পি তৈরি করুন :
ইন custom_tags.py একটি কাস্টম ট্যাগ ফাংশন যে একটি অবাধ কী অ্যাক্সেস প্রদান করে তৈরি সেটিংস ধ্রুবক:
from django import template
from django.conf import settings
register = template.Library()
@register.simple_tag
def get_setting(name):
return getattr(settings, name, "")
এই কোডটি বোঝার জন্য আমি জাজানো ডক্সে সহজ ট্যাগে বিভাগটি পড়ার পরামর্শ দিচ্ছি ।
তারপরে, আপনি যে কোনও টেমপ্লেটে যেখানে এটি ব্যবহার করবেন তা এই ফাইলটি লোড করে আপনার জাঙ্গোকে (এবং কোনও অতিরিক্ত) কাস্টম ট্যাগ সম্পর্কে সচেতন করতে হবে। আপনার যেমন বিল্টটিকে স্থির ট্যাগটিতে লোড করতে হবে:
{% load custom_tags %}
এটি লোড হওয়ার সাথে এটি অন্য যে কোনও ট্যাগের মতোই ব্যবহার করা যেতে পারে, আপনাকে যে নির্দিষ্ট সেটিংস ফেরতের দরকার তা কেবল সরবরাহ করুন। সুতরাং আপনার সেটিংসে যদি আপনার BUILD_VERSION পরিবর্তনশীল থাকে:
{% get_setting "BUILD_VERSION" %}
এই সমাধানটি অ্যারেগুলির সাথে কাজ করবে না, তবে আপনার যদি প্রয়োজন হয় তবে আপনি আপনার টেমপ্লেটগুলিতে অনেক যুক্তি যুক্ত করতে পারেন।
দ্রষ্টব্য: একটি আরও পরিষ্কার এবং ব্যর্থ সাফ সমাধান সম্ভবত একটি কাস্টম প্রসঙ্গ প্রসেসর তৈরি করা হবে যেখানে আপনি সমস্ত টেমপ্লেটগুলিতে উপলভ্য প্রসঙ্গের জন্য আপনার প্রয়োজনীয় সেটিংস যুক্ত করতে পারেন। এইভাবে আপনি ভুল করে আপনার টেম্পলেটগুলিতে সংবেদনশীল সেটিংস আউটপুট দেওয়ার ঝুঁকি হ্রাস করেন।
নামক একটি ফাইলে এই কোডটি যুক্ত করুন context_processors.py
:
from django.conf import settings as django_settings
def settings(request):
return {
'settings': django_settings,
}
এবং তারপর, আপনার সেটিংস ফাইল, একটি পাথ যেমন অন্তর্ভুক্ত 'speedy.core.base.context_processors.settings'
(আপনার অ্যাপ নাম এবং পাথ দিয়ে) 'context_processors'
সেটিংস TEMPLATES
।
(আপনি উদাহরণস্বরূপ সেটিংস / বেস.পি এবং কনটেক্সট_প্রসেসার্স.পি দেখতে পারেন )।
তারপরে আপনি যে কোনও টেম্পলেট কোডে নির্দিষ্ট সেটিংস ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:
{% if settings.SITE_ID == settings.SPEEDY_MATCH_SITE_ID %}
আপডেট: উপরের কোডটি আপনার যেমন সংবেদনশীল তথ্য সহ টেমপ্লেটগুলিতে সমস্ত সেটিংস উন্মুক্ত করে SECRET_KEY
। টেমপ্লেটগুলিতে এই জাতীয় তথ্য প্রদর্শন করতে কোনও হ্যাকার এই বৈশিষ্ট্যটির অপব্যবহার করতে পারে। আপনি যদি টেমপ্লেটগুলিতে কেবলমাত্র নির্দিষ্ট সেটিংসই প্রকাশ করতে চান তবে পরিবর্তে এই কোডটি ব্যবহার করুন:
def settings(request):
settings_in_templates = {}
for attr in ["SITE_ID", ...]: # Write here the settings you want to expose to the templates.
if (hasattr(django_settings, attr)):
settings_in_templates[attr] = getattr(django_settings, attr)
return {
'settings': settings_in_templates,
}
SECRET_KEY
। টেমপ্লেটগুলিতে এই জাতীয় তথ্য প্রদর্শন করতে কোনও হ্যাকার এই বৈশিষ্ট্যটির অপব্যবহার করতে পারে।
বচহুনের উপরের উদাহরণটি দুর্দান্ত except নীচে একটি সেটিংস উদাহরণ রয়েছে যা আপনি কীভাবে সেটিংস.পি-এর সমস্ত উচ্চ-কেস বৈশিষ্ট্যগুলি থেকে প্রসঙ্গত অভিধানটি স্বয়ংক্রিয়ভাবে তৈরি করতে পারবেন (পুনরায়: "^ [A-Z0-9 _] + $")।
সেটিংস.পি এর শেষে:
_context = {}
local_context = locals()
for (k,v) in local_context.items():
if re.search('^[A-Z0-9_]+$',k):
_context[k] = str(v)
def settings_context(context):
return _context
TEMPLATE_CONTEXT_PROCESSORS = (
...
'myproject.settings.settings_context',
...
)
যদি আমার মতো কেউ যদি এই প্রশ্নটি খুঁজে পান তবে আমি আমার সমাধান পোস্ট করব যা জাঙ্গো 2.0 তে কাজ করে:
এই ট্যাগটি কিছু সেটিংস নির্ধারণ করে py টেমপ্লেটের ভেরিয়েবলের জন্য ভেরিয়েবল মান:
ব্যবহার: {% get_settings_value template_var "SETTINGS_VAR" %}
from django import template
from django.conf import settings
register = template.Library()
class AssignNode(template.Node):
def __init__(self, name, value):
self.name = name
self.value = value
def render(self, context):
context[self.name] = getattr(settings, self.value.resolve(context, True), "")
return ''
@register.tag('get_settings_value')
def do_assign(parser, token):
bits = token.split_contents()
if len(bits) != 3:
raise template.TemplateSyntaxError("'%s' tag takes two arguments" % bits[0])
value = parser.compile_filter(bits[2])
return AssignNode(bits[1], value)
{% load my_custom_tags %}
# Set local template variable:
{% get_settings_value settings_debug "DEBUG" %}
# Output settings_debug variable:
{{ settings_debug }}
# Use variable in if statement:
{% if settings_debug %}
... do something ...
{% else %}
... do other stuff ...
{% endif %}
কীভাবে কাস্টম টেম্পলেট ট্যাগগুলি তৈরি করবেন তা জ্যাঙ্গোর ডকুমেন্টেশন দেখুন: https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/
{% if settings_debug %}
{% if settings_debug == True %}
আপনার প্রস্তাবিত{% if settings_debug %}
কোনও শ্রেণিভিত্তিক দর্শন ব্যবহার করা হলে:
#
# in settings.py
#
YOUR_CUSTOM_SETTING = 'some value'
#
# in views.py
#
from django.conf import settings #for getting settings vars
class YourView(DetailView): #assuming DetailView; whatever though
# ...
def get_context_data(self, **kwargs):
context = super(YourView, self).get_context_data(**kwargs)
context['YOUR_CUSTOM_SETTING'] = settings.YOUR_CUSTOM_SETTING
return context
#
# in your_template.html, reference the setting like any other context variable
#
{{ YOUR_CUSTOM_SETTING }}
IanSR এবং bchhun উভয়ই সেটিংসে TEMPLATE_CONTEXT_PROCESSORS ওভাররাইড করার পরামর্শ দিয়েছিল। সচেতন থাকুন যে এই সেটিংটিতে একটি ডিফল্ট রয়েছে যা আপনি ডিফল্টগুলি পুনরায় সেট না করে ওভাররাইড করলে কিছু চতুর জিনিস ঘটায়। ডিফল্টগুলি জ্যাঙ্গোর সাম্প্রতিক সংস্করণগুলিতেও পরিবর্তিত হয়েছে।
https://docs.djangoproject.com/en/1.3/ref/settings/#template-context-processors
ডিফল্ট TEMPLATE_CONTEXT_PROCESSORS:
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.contrib.messages.context_processors.messages")
আমরা যদি কোনও একক ভেরিয়েবলের প্রসঙ্গে বনাম টেম্পলেট ট্যাগগুলির তুলনা করতে পারি, তবে আরও কার্যকর বিকল্পটি জানার পক্ষে সুবিধাজনক হতে পারে। যাইহোক, কেবলমাত্র সেই টেম্পলেটগুলি থেকে যে পরিবর্তনশীলগুলির প্রয়োজন সেগুলি থেকে আপনি সেটিংসে ডুব দেওয়া থেকে ভাল। সেক্ষেত্রে ভেরিয়েবলটি সমস্ত টেম্পলেটগুলিতে পাস করার অর্থ নেই। তবে আপনি যদি ভেরিয়েবলটিকে একটি বেস টেম্পলেট যেমন বেস হিটটিএমএল টেমপ্লেটে প্রেরণ করছেন তবে তা বেসিক হার্ট HTML টেমপ্লেটটি প্রতিটি অনুরোধে রেন্ডার করে তাতে কিছু যায় আসে না, তাই আপনি যে কোনও পদ্ধতি ব্যবহার করতে পারেন।
আপনি যদি টেমপ্লেট ট্যাগ বিকল্পের সাথে যাওয়ার সিদ্ধান্ত নেন তবে নীচের কোডটি ব্যবহার করুন কারণ এটি আপনাকে একটি ডিফল্ট পাস করার অনুমতি দেয় মানটি , কেবলমাত্র প্রশ্নে ভেরিয়েবলটি অপরিজ্ঞাত করে দেওয়া হয়।
উদাহরণ: get_from_setting my_context_value হিসাবে my_variable
উদাহরণ: get_from_setting my_variable my_default my_context_value হিসাবে
class SettingsAttrNode(Node):
def __init__(self, variable, default, as_value):
self.variable = getattr(settings, variable, default)
self.cxtname = as_value
def render(self, context):
context[self.cxtname] = self.variable
return ''
def get_from_setting(parser, token):
as_value = variable = default = ''
bits = token.contents.split()
if len(bits) == 4 and bits[2] == 'as':
variable = bits[1]
as_value = bits[3]
elif len(bits) == 5 and bits[3] == 'as':
variable = bits[1]
default = bits[2]
as_value = bits[4]
else:
raise TemplateSyntaxError, "usage: get_from_settings variable default as value " \
"OR: get_from_settings variable as value"
return SettingsAttrNode(variable=variable, default=default, as_value=as_value)
get_from_setting = register.tag(get_from_setting)