मेरे पास सेटिंग्स में कुछ सामान है जो मैं एक टेम्पलेट से एक्सेस करने में सक्षम होना चाहता हूं, लेकिन मुझे यह पता नहीं है कि यह कैसे करना है। मैंने पहले ही कोशिश की
{{CONSTANT_NAME}}
लेकिन वह काम नहीं करता है। क्या यह संभव है?
मेरे पास सेटिंग्स में कुछ सामान है जो मैं एक टेम्पलेट से एक्सेस करने में सक्षम होना चाहता हूं, लेकिन मुझे यह पता नहीं है कि यह कैसे करना है। मैंने पहले ही कोशिश की
{{CONSTANT_NAME}}
लेकिन वह काम नहीं करता है। क्या यह संभव है?
जवाबों:
Django टेम्पलेट के लिए कुछ, अक्सर उपयोग की जाने वाली सेटिंग कॉन्स्टेंट जैसे कि settings.MEDIA_URL
और कुछ भाषा सेटिंग्स तक पहुंच प्रदान करता है यदि आप django के जेनेरिक व्यूज का उपयोग करते हैं या 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 }}
, आदि।
यदि आप सेटिंग में अन्य स्थिरांक तक पहुंच की तलाश कर रहे हैं, तो बस उन स्थिरांक को अनपैक करें और उन्हें उस संदर्भ शब्दकोश में जोड़ें जो आप अपने दृश्य फ़ंक्शन में उपयोग कर रहे हैं, जैसे:
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
शामिल करने से बचने के लिए शॉर्टकट का उपयोग कर सकते हैं जिसमें RequestContext शामिल है: docs.djangoproject.com/en/1.6/topics/http/shortcuts/#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>
ऐसा करने का एक और तरीका कस्टम टेम्पलेट टैग बनाना है जो आपको सेटिंग्स से मछली के मूल्यों को दे सकता है।
@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}}
।
Django 2.0+ के साथ इसे हल करने वाले कस्टम टेम्प्लेट टैग बनाने के लिए पूरे निर्देशों के साथ एक उत्तर जोड़ना
अपने ऐप-फोल्डर में, टेम्प्लेटेटैग्स नामक एक फोल्डर बनाएं । इसमें __init__.py और custom_tags.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, "")
इस कोड को समझने के लिए मैं Django डॉक्स में सरल टैग पर अनुभाग पढ़ने की सलाह देता हूं ।
फिर, आपको Django को इस (और किसी भी अतिरिक्त) कस्टम टैग से इस फ़ाइल को किसी भी टेम्पलेट में लोड करके जागरूक करना होगा जहां आप इसका उपयोग करेंगे। जैसे आपको स्थैतिक टैग में निर्मित लोड करने की आवश्यकता है:
{% 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
।
(उदाहरण के लिए आप देख सकते हैं सेटिंग्स / base.py और context_processors.py )।
फिर आप किसी भी टेम्पलेट कोड में विशिष्ट सेटिंग का उपयोग कर सकते हैं। उदाहरण के लिए:
{% 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
। टेम्प्लेट में ऐसी जानकारी प्रदर्शित करने के लिए कोई हैकर इस सुविधा का दुरुपयोग कर सकता है।
Bchhun से ऊपर का उदाहरण अच्छा है, सिवाय इसके कि आपको सेटिंगफ्रेम से अपना संदर्भ शब्दकोश स्पष्ट रूप से बनाने की आवश्यकता है। नीचे एक उदाहरण दिया गया है कि आप सेटिंग के सभी अपर-केस विशेषताओं से संदर्भ शब्दकोश को ऑटो-कैसे बना सकते हैं (पुनः: "^ [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',
...
)
अगर किसी को यह सवाल लगता है जैसे मैंने किया, तो मैं अपना समाधान पोस्ट करूंगा जो कि Django 2.0 पर काम करता है:
यह टैग टेम्प्लेट के वैरिएबल के लिए कुछ सेटिंग्स। चर चर प्रदान करता है:
उपयोग: {% 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 %}
Django के दस्तावेज़ देखें कि यहां कस्टम टेम्पलेट टैग कैसे बनाए जाएं : 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 को ओवरराइड करने का सुझाव दिया। ध्यान रखें कि इस सेटिंग में एक डिफ़ॉल्ट है जो कुछ खराब चीजों का कारण बन सकता है यदि आप इसे चूक को फिर से सेट किए बिना ओवरराइड करते हैं। Django के हाल के संस्करणों में चूक भी बदल गए हैं।
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")
यदि हम किसी एकल चर पर संदर्भ बनाम टेम्प्लेट टैग की तुलना करते हैं, तो अधिक कुशल विकल्प को जानना बहुत ही हानिकारक हो सकता है। हालाँकि, आप केवल उस चर की जरूरत वाले टेम्पलेट्स से सेटिंग में डुबाना बेहतर समझ सकते हैं। उस मामले में यह चर को सभी टेम्प्लेट में पास करने के लिए समझ में नहीं आता है। लेकिन अगर आप वैरिएबल को बेस टेम्प्लेट जैसे सामान्य टेम्पलेट में भेज रहे हैं, तो इससे कोई फर्क नहीं पड़ेगा क्योंकि बेस पेज टेम्पलेट हर अनुरोध पर प्रदान किया जाता है, इसलिए आप या तो तरीकों का उपयोग कर सकते हैं।
यदि आप टेम्पलेट टैग विकल्प के साथ जाने का निर्णय लेते हैं, तो निम्न कोड का उपयोग करें क्योंकि यह आपको डिफ़ॉल्ट मान को पास करने की अनुमति देता है, बस मामले में चर-प्रश्न अपरिभाषित था।
उदाहरण: get_from_settings my_variable my_context_value के रूप में
उदाहरण: get_from_settings my_variable my_default as 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)