আমি কি জ্যাঙ্গোর টেমপ্লেটগুলি থেকে সেটিংস.পিএর ধ্রুবকগুলিতে অ্যাক্সেস করতে পারি?


367

আমার সেটিংস.পি-তে কিছু জিনিস রয়েছে যা আমি কোনও টেমপ্লেট থেকে অ্যাক্সেস করতে সক্ষম হতে চাই তবে কীভাবে এটি করব তা আমি বুঝতে পারি না। আমি ইতিমধ্যে চেষ্টা করেছি

{{CONSTANT_NAME}}

কিন্তু এটি কাজ করে না বলে মনে হচ্ছে। এটা কি সম্ভব?


আপনি যদি প্রতিটি উত্তরে একটি সেটিংস কীভাবে পাস করবেন তা সন্ধান করছেন, প্রসঙ্গ প্রসেসর সম্পর্কে Bchunn এর উত্তরটি দেখুন
জাগস

1
@Jkbrzt এর উত্তরটি একটি পূর্ব-প্যাকেজযুক্ত সমাধান যা এই সমস্যাটি দ্রুত এবং সহজেই সমাধান করে। ভবিষ্যতের পাঠকদের গ্রহণ করা উত্তরের চেয়ে এই স্ট্যাকওভারফ্লো.com/ a/ 25841039/396005 এ একবার দেখে নেওয়া উচিত
ব্রোন ডেভিস

উত্তর:


183

জ্যাঙ্গো নির্দিষ্ট, প্রায়শই ব্যবহৃত সেটিংসের টেমপ্লেটগুলিতে অ্যাক্সেস সরবরাহ করে যেমন 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 }}


66
এটি লক্ষ্য করার মতো যে একটি অনুরোধকন্টেক্সট ব্যবহার করে যুক্ত করা নির্দিষ্ট মানগুলি TEMPLATE_CONTEXT_PROCESSORS এর মানের উপর নির্ভরশীল। সুতরাং আপনি যদি সমস্ত জায়গাতে অতিরিক্ত মান পাস করতে চান তবে আপনার নিজের প্রসঙ্গ প্রসেসরটি লিখে TEMPLATE_CONTEXT_PROCESSORS এ যুক্ত করুন।
কার্ল মেয়ার

জেনেরিক ভিউগুলিতে ধারাবাহিকতার উপর একটি বিন্দু এবং মূল এবং অবদানের অনেকগুলি অ্যাপ্লিকেশনগুলিকে অতিরিক্ত প্রসঙ্গকে এক্সট্রা_কন্টেক্সট বলা হয় এবং খুব প্রায়ই এটি ভিউয়ের যুক্তিতে অন্তর্ভুক্ত করা হয়।
সোভিয়েট

"জ্যাঙ্গো নির্দিষ্ট, প্রায়শই ব্যবহৃত সেটিংসের সেটিংসের মতো ধরণের ধীরে ধীরে অ্যাক্সেস সরবরাহ করে M যেমন মিডিয়া_উইউআরএল"। এটি জ্যাঙ্গো ১.৩ এ কাজ করবে বলে মনে হচ্ছে না, যদিও আমি সম্ভবত এটি ভুল ব্যবহার করছি। এই বৈশিষ্ট্যের জন্য কোনও ডকুমেন্টেশন আছে?
সিস্টেমপারাডক্স

1
@ আসফিয়ান হ্যাঁ, একটি কাস্টম টেম্পলেট প্রসঙ্গ প্রসেসর তৈরি করুন এবং সেটিংস.পিকে TEMPLATE_CONTEXT_PROCESSORS এ যুক্ত করুন।
পাওলো

14
তাকিয়ে থাক কেন django-settings-exportযে দৃশ্য এই কোড লিখতে প্রয়োজন এড়ানো।
qris

441

আপনি যদি প্রতিটি অনুরোধ এবং টেম্পলেটটির জন্য এটির মান রাখতে চান তবে একটি প্রসঙ্গ প্রসেসর ব্যবহার করা আরও উপযুক্ত।

এখানে কীভাবে:

  1. 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}
  2. আপনার সেটিংস.পি ফাইলটিতে আপনার প্রসঙ্গ প্রসেসর যুক্ত করুন:

    TEMPLATES = [{
        # whatever comes before
        'OPTIONS': {
            'context_processors': [
                # whatever comes before
                "your_app.context_processors.admin_media",
            ],
        }
    }]
  3. RequestContextআপনার টেমপ্লেটে আপনার প্রসঙ্গ প্রসেসর যুক্ত করতে আপনার দৃষ্টিতে ব্যবহার করুন। renderশর্টকাট এই স্বয়ংক্রিয়ভাবে আছে:

    from django.shortcuts import render
    
    def my_view(request):
        return render(request, "index.html")
  4. এবং অবশেষে, আপনার টেমপ্লেটে:

    ...
    <a href="{{ ADMIN_MEDIA_URL }}">path to admin media</a>
    ...

32
@ মার্কএসেল এই হুপগুলি তৈরি করা হয়েছে যাতে আপনি যতক্ষণ না এটি রিকোয়েস্টকন্টেক্সট ফাংশনটি ব্যবহার করবেন ততক্ষণ আপনি প্রতিটি ভিউতে পরিবর্তনশীল অ্যাক্সেসযোগ্য। আপনি প্রতিটি ভিউতে ম্যানুয়ালি একটি সেটিংস পরিবর্তনশীল আনতে পারেন could আমি যে কোনও সময় ভাল অল এর অনুলিপি এবং পেস্টের পরিবর্তে পুনরায় ব্যবহারযোগ্য কনসেক্সট প্রসেসরটি বেছে নেব।
bchhun

5
সর্বদা সম্ভব অনুলিপি / পেস্ট এড়ানোর জন্য যথাসাধ্য চেষ্টা করছি। প্রতিটি এবং প্রতিটি অ্যাপ্লিকেশন (একটি প্রকল্পের মধ্যে) একটি প্রসঙ্গ_প্রসেসর.পি প্রয়োজন, তাদের সকলের জন্য একটি প্রসঙ্গ_প্রসেসর তৈরি করার উপায় আছে?
এস্কেল

10
@bchhun আমি সবেমাত্র পরীক্ষিত (জাজানো ১.৩): অ্যাপ্লিকেশনগুলির মধ্যে একটি প্রসঙ্গ প্রসেসরের ভাগ করে নেওয়া ঠিক কাজ করে। :-) আমি context_process.pyআমার settings.pyফাইলের ঠিক পাশে রেখেছি এবং "context_processors.admin_media"আমার TEMPLATE_CONTEXT_PROCESSORSতালিকায় যুক্ত করেছি । এছাড়াও, আপনি এই সত্যটি সম্পর্কে আপনার উত্তরে একটি নোট যুক্ত করতে চাইতে পারেন যে TEMPLATE_CONTEXT_PROCESSORS এর ডিফল্ট মানটি খালি নয়, সুতরাং যদি কোনও বিদ্যমান কোড যদি সেই ডিফল্ট প্রসঙ্গ প্রসেসরের দ্বারা নির্ধারিত মানগুলির কোনও ব্যবহার করে, তবে আপনি যদি তাদের আবার না যোগ করেন তবে সেগুলি কাজ করবে না স্পষ্টভাবে তালিকায়।
MiniQuark

5
@ মার্কএসেল মোটেও বেদনাদায়ক নয় - তিনি কেবল সমস্ত কিছু বানান করেছেন। এটি সত্যিই কেবলমাত্র 6 টি ছোট লাইন (পদক্ষেপ 1 এবং 2)। পদক্ষেপ 3 & 4 বা তাদের সমতুল্য যে কোনও উপায়ে বেশিরভাগ টেম্পলেটগুলির জন্য প্রয়োজনীয়।
রিক ওয়েস্টেরার

2
renderজাঙ্গো ১.৩ অনুসারে, আপনি স্পষ্টভাবে অনুরোধকন্টেক্সট: ডকস.ডজ্যাঙ্গোপ্রজেক্ট
এন

269

আমি একক কাস্টম টেম্পলেট ট্যাগ হওয়ায় সবচেয়ে সহজ পদ্ধতির সন্ধান পেয়েছি :

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" %}

17
টেমপ্লেটগুলিতে যে কোনও সেটিংয়ের অন-চাহিদা অ্যাক্সেস করতে আমি পছন্দ করি এবং এটি এটি মার্জিতভাবে সরবরাহ করে। আপনি যদি আপনার টেম্পলেটগুলিতে ঘন ঘন বিভিন্ন সেটিংস ব্যবহার করেন তবে এটি অন্যান্য উত্তরের চেয়ে সত্যিই অনেক ভাল: 1) গৃহীত উত্তরটি ক্লাস-ভিত্তিক মতামতের সাথে সঙ্গতিপূর্ণ বা বেহাল। 2) অতিরিক্ত ভোট দেওয়া টেম্পলেট প্রসঙ্গটি প্রসেসরের সমাধানের সাথে, আপনাকে স্বতন্ত্র সেটিংস (বা সমস্ত) নির্দিষ্ট করতে হবে এবং এটি প্রতিটি একক অনুরোধের জন্য চলবে যা কোনও টেমপ্লেট রেন্ডার করে - অদক্ষ! 3) এটি উপরের আরও জটিল ট্যাগের চেয়ে সহজ।
বেন রবার্টস

16
@ বেনরোবার্টস আমি একমত যে এটি একটি মার্জিত সমাধান ... তবে কেবলমাত্র একক বিকাশকারী ক্ষুদ্র প্রকল্পগুলির জন্য যা সবকিছু করে। আপনার যদি নকশা এবং উন্নয়নের জন্য পৃথক লোক / দল থাকে তবে এই সমাধানটি সম্ভবত সবচেয়ে খারাপ । কি ভালো কিছু সঙ্গে এই ট্যাগটি অপব্যবহার ডিজাইনার বন্ধ করার {% settings_value "DATABASES" %}? এই ব্যবহারের ক্ষেত্রে এটি স্পষ্ট করে তুলতে হবে যে কেন শুরু হতে টেমপ্লেটে সেটিংস উপলব্ধ নেই।
mkoistinen

23
"আমরা সকলেই এখানে প্রাপ্তবয়স্কদের সম্মতি
দিচ্ছি

11
আমাকে নবাগত হওয়ার জন্য ক্ষমা করুন। আপনি এই কোডটি কোথায় রাখবেন? Views.py? বা একটি নতুন ফাইলে?
নোয়েল ল্লেভেরেস

13
অন্যান্য ব্যক্তির জন্য পরিষ্কার হওয়ার জন্য, আপনার প্রয়োজন: 1) templatetagsআপনার অ্যাপ্লিকেশনের মধ্যে একটি খালি __init__.pyফাইল এবং এই কোডটিকে সেই ফোল্ডারের অভ্যন্তরে একটি ফোল্ডার তৈরি করতে হবে settings.py। 2) আপনার টেম্পলেটটিতে আপনি যুক্ত করুন {% load settings %}এবং তারপরে আপনার নতুন ট্যাগটি ব্যবহার করুন!
দামিও

95

চেক আউট django-settings-export(অস্বীকৃতি: আমি এই প্রকল্পের লেখক)।

উদাহরণ স্বরূপ...

$ pip install django-settings-export

settings.py

TEMPLATES = [
    {
        'OPTIONS': {
            'context_processors': [
                'django_settings_export.settings_export',
            ],
        },
    },
]

MY_CHEESE = 'Camembert';

SETTINGS_EXPORT = [
    'MY_CHEESE',
]

template.html

<script>var MY_CHEESE = '{{ settings.MY_CHEESE }}';</script>

1
এবং মনে রাখবেন যে আপনার মতামতে আপনাকে ব্যবহার করা উচিত renderএবং নাrender_to_response
এভারেট টিউজ

টেমপ্লেটগুলিতে সেট করা থেকে মানগুলি পড়ার জন্য আমার একইরকম প্রয়োজনীয়তা রয়েছে তবে আমি ফাইল সেটিংয়ে 'django_settings_export.settings_export' যুক্ত করার পরে 500 ত্রুটি পাচ্ছি you আপনি এখানে কী ভুল করছেন তা বলতে পারেন
পিয়ুশ সাহু

3
এটি 2019 এবং আমি এটি আমার প্রকল্পে ব্যবহার করছি। ধন্যবাদ!
শিববধু

1
আমি @ সিভুবধের সাথে একমত এটি আমার পক্ষেও সর্বোত্তম সমাধান কারণ এটি ১. এটি কেন্দ্রীভূত যার অর্থ আমার অতিরিক্ত ফোল্ডার এবং ফাইলের প্রয়োজন নেই, ২. আমি আমার টেমপ্লেটে সেটিংসের নেমস্পেস দেখতে পাচ্ছি যা অনেকগুলি অ্যাপ্লিকেশনের রেফারেন্স পেতে খুব সহায়ক।
ywiyogo

46

এটি করার আরেকটি উপায় হ'ল একটি কাস্টম টেমপ্লেট ট্যাগ তৈরি করা যা আপনাকে সেটিংসের বাইরে মানগুলি ফিশ করতে দেয়।

@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" %}

কনটেক্সট-প্রসেসরের হুপের মাধ্যমে ঝাঁপিয়ে না ফেলে এটিকে কোনও পৃষ্ঠায় মুদ্রণ করতে।


6
আমি মনে করি এটি সবচেয়ে মার্জিত সমাধান, কারণ এটি কোড পরিবর্তন না করে ড্রপিন হিসাবে কাজ করে।
উড়ন্ত ভেড়া

1
আপনি আপনার অ্যাপ্লিকেশনের বিশ্রাম ছেড়ে করতে পারে অবিকৃত: আপনি একটি ট্যাগ এটা পরিবর্তে প্রসঙ্গ প্রসেসর (সম্পাদনা বিভিন্ন স্থানে আপনার অ্যাপ্লিকেশনে যা মানে আপনি যে) যোগ করার থাকার জুড়তে এবং ব্যবহার,
ভেড়া উড়ন্ত

2
@ মার্ক - ইনডিটি / এসসিআর / প্রোডাই / টেম্পলেট_ইটিলেস / টেম্পলেটট্যাগ / কাস্টম_টেম্পলেট_ফিল্টারস.পি. টেমপ্লেট_ইটিলগুলি সেটিংস.পি ইনস্টলড_এপিপিএস থেকে উল্লেখ করা হয়েছে - এছাড়াও ডকস.ড্যাঞ্জোপ্রজেক্ট / এএন / দেবদেহো / কাস্টম- টেম্পলেট- ট্যাগগুলি দেখুন

সহায়তা ক্রিসের প্রশংসা করুন, কাস্টম_টেম্পলেট_ফিল্টার সহ টেম্পলেটট্যাগগুলি উপ-ডিরেক্টরিতে একটি মুটি অ্যাপ্লিকেশন যুক্ত করুন। হোমপৃষ্ঠায় এখনও একটি ত্রুটি পেয়েছে html "" অবৈধ ব্লক ট্যাগ: 'মান_ফ্রোম_সেটেটিংস', প্রত্যাশিত 'এন্ডব্লক' বা 'এন্ডব্লক ব্যানার' "
মার্ক এসেল

আমি মনে করি এটি প্রসঙ্গ ডেকোরেটর সংস্করণটি ব্যবহার করে আপনি কী সেটিংস প্রকাশ করতে হবে ঠিক তা বেছে নিয়ে "স্পষ্টকৃতের চেয়ে সুস্পষ্ট ভাল" এর বিরুদ্ধে যায় against
sjh

28

আমি বেরিস্লাভের সমাধানটি পছন্দ করি কারণ সহজ সাইটগুলিতে এটি পরিষ্কার এবং কার্যকর। আমি যা পছন্দ করি না তা হ'ল সমস্ত সেটিংসের কনস্ট্যান্টগুলি উইলি-নিলির বহিঃপ্রকাশ। সুতরাং আমি যা করে শেষ করেছি তা হ'ল:

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" %}

এটি কোনও ধরণের প্রতিরোধকে সুরক্ষা দেয় যা আপনি টেম্পলেটটিতে ব্যবহার থেকে নাম প্রকাশ করেন নি এবং আপনি যদি সত্যিই অভিনব হতে চান তবে আপনি সেটিংসে একটি টিপল সেট করতে পারেন এবং বিভিন্ন পৃষ্ঠা, অ্যাপস বা অঞ্চলগুলির জন্য একাধিক টেমপ্লেট ট্যাগ তৈরি করতে পারেন এবং সহজভাবে প্রয়োজন অনুসারে স্থানীয় টিউপলকে সেটিংস টিপলটির সাথে একত্রিত করুন, তারপরে মানটি গ্রহণযোগ্য কিনা তা দেখার জন্য তালিকা বোধগম্য করুন।
আমি একমত, একটি জটিল সাইটে, এটি কিছুটা সরল, তবে এমন মান রয়েছে যা সর্বজনীনভাবে টেমপ্লেটগুলিতে রাখা ভাল, এবং এটি দুর্দান্তভাবে কাজ করে বলে মনে হয়। আসল ধারণাটির জন্য বার্লিসালাকে ধন্যবাদ!


5
কেন সহজভাবে নয়if name in ALLOWABLE_VALUES: ...
frnhr

কারণ আমি ভেবেছিলাম যে আমি চালাক হয়ে উঠছি এবং উপ-স্ট্রিংগুলিকে সেটিংসের ভেরিগার থেকে আটকাতে চেয়েছিলাম। ;-) প্রত্যাবর্তনটি সম্ভবত হওয়া উচিত: রিটার্ন গেটআটার (সেটিংস, is_allowable, '')
MontyThreeCard

5
যে কারও জন্য অবাক 'val' in ('val_first', 'second_val',)হচ্ছেন তার জন্য কেবল স্পষ্ট করে বলা: এটি Falseএখানে কোনও স্ট্রাস্টিং সমস্যা নেই।
frnhr

2
আমি কীভাবে এটি ifবিবৃতিতে ব্যবহার করতে পারি ? আমি DEBUGমানটি যাচাই করতে চাই
এজে

যদি কারও সাথে আবার সংযুক্ত সংস্করণ প্রয়োজন হয় gist.github.com/BrnoPCmaniak/632f56ddb907108b3d43fa862510dfca
ফিলিপ

12

আমি ক্রিসডিউর উত্তর উন্নত করেছি (আপনার নিজের ট্যাগ তৈরি করতে) কিছুটা ।

প্রথমে, ফাইলটি তৈরি করুন 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}}


12

জ্যাঙ্গো ২.০+ সহ এটির সমাধান করে এমন একটি কাস্টম টেম্পলেট ট্যাগ তৈরির জন্য সম্পূর্ণ নির্দেশাবলীর সাথে একটি উত্তর যুক্ত করা

আপনার অ্যাপ-ফোল্ডারে, টেম্পলেটট্যাগগুলি নামে একটি ফোল্ডার তৈরি করুন । এটিতে __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" %}

এই সমাধানটি অ্যারেগুলির সাথে কাজ করবে না, তবে আপনার যদি প্রয়োজন হয় তবে আপনি আপনার টেমপ্লেটগুলিতে অনেক যুক্তি যুক্ত করতে পারেন।

দ্রষ্টব্য: একটি আরও পরিষ্কার এবং ব্যর্থ সাফ সমাধান সম্ভবত একটি কাস্টম প্রসঙ্গ প্রসেসর তৈরি করা হবে যেখানে আপনি সমস্ত টেমপ্লেটগুলিতে উপলভ্য প্রসঙ্গের জন্য আপনার প্রয়োজনীয় সেটিংস যুক্ত করতে পারেন। এইভাবে আপনি ভুল করে আপনার টেম্পলেটগুলিতে সংবেদনশীল সেটিংস আউটপুট দেওয়ার ঝুঁকি হ্রাস করেন।


9

নামক একটি ফাইলে এই কোডটি যুক্ত করুন 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,
    }

1
আমি গতকাল এই সমস্যার মুখোমুখি হয়েছি, এই পোস্টটি পেয়েছি, তারপরে আরও 2 জন এবং একটি ব্লগ পোস্ট পেয়েছি এবং অনুভব করেছি যে তাদের প্রত্যেকটিই অত্যন্ত জটিল ছিল (দুর্ভাগ্যক্রমে আমি এটিকে পৃষ্ঠায় ফেলেছি না, আমার জন্য লজ্জাজনক)। সুতরাং আমি আমার নিজস্ব ঘূর্ণায়মান শেষ, যা একেবারে এই সমাধান। আমি ঠিক ফিরে এসেছি কারণ এটি আমাকে বগ করছে যে যখন লোকেরা প্লাগইন এবং একটি সম্পূর্ণ লোটা কোডের পরামর্শ দিচ্ছে যখন এই ^^^ 3-লাইনের ফাংশন এবং সেটিংস.পিটিতে 1-লাইন পরিবর্তন রয়েছে।
ডিএক্সএম

@ ডিএক্সএম ধন্যবাদ!
উরি

প্রকৃতপক্ষে আমার সমাধানটি টেমপ্লেটগুলিতে সমস্ত সেটিংসকে প্রকাশ করে যেমন সংবেদনশীল তথ্য সহ SECRET_KEY। টেমপ্লেটগুলিতে এই জাতীয় তথ্য প্রদর্শন করতে কোনও হ্যাকার এই বৈশিষ্ট্যটির অপব্যবহার করতে পারে।
উরি

আমি আমার উত্তর আপডেট।
উরি

ভাল ... দুর্দান্ত, এখন আমার ওয়েবসাইটটিতেও একই সমস্যা আছে :) তবে ... আমি হয়ত কিছু মিস করছি, তবে আমরা কি নিশ্চিত যে এখানে কোনও সমস্যা আছে? টেমপ্লেটগুলি মূলত আপনার ওয়েবসাইটের উত্স কোডের মতো, তাই না? এগুলি সার্ভার-সাইডে সংরক্ষণ করা হয় এবং সরাসরি সম্মুখ-প্রান্ত থেকে অ্যাক্সেসযোগ্য। যদি কোনও হ্যাকার কোনও টেম্পলেট পরিবর্তন করতে পারে তবে সেই মুহুর্তে তারা কোনও .py ফাইল পরিবর্তন করতে পারে।
ডিএক্সএম

8

বচহুনের উপরের উদাহরণটি দুর্দান্ত 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',
...
)

8

যদি আমার মতো কেউ যদি এই প্রশ্নটি খুঁজে পান তবে আমি আমার সমাধান পোস্ট করব যা জাঙ্গো 2.0 তে কাজ করে:

এই ট্যাগটি কিছু সেটিংস নির্ধারণ করে py টেমপ্লেটের ভেরিয়েবলের জন্য ভেরিয়েবল মান:

ব্যবহার: {% get_settings_value template_var "SETTINGS_VAR" %}

অ্যাপ্লিকেশন / templatetags / my_custom_tags.py:

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/


1
{% if settings_debug %}
ব্যবহারকারী 66081

ধন্যবাদ @ user66081! {% if settings_debug == True %}আপনার প্রস্তাবিত{% if settings_debug %}
NullIsNot0

7

কোনও শ্রেণিভিত্তিক দর্শন ব্যবহার করা হলে:

#
# 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 }}

3

আমি এটি জ্যাঙ্গো ১.৩ এর সহজতম পদ্ধতির বলে মনে করেছি:

  1. views.py

    from local_settings import BASE_URL
    
    def root(request):
        return render_to_response('hero.html', {'BASE_URL': BASE_URL})
  2. hero.html

    var BASE_URL = '{{ JS_BASE_URL }}';

1

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

1

আমরা যদি কোনও একক ভেরিয়েবলের প্রসঙ্গে বনাম টেম্পলেট ট্যাগগুলির তুলনা করতে পারি, তবে আরও কার্যকর বিকল্পটি জানার পক্ষে সুবিধাজনক হতে পারে। যাইহোক, কেবলমাত্র সেই টেম্পলেটগুলি থেকে যে পরিবর্তনশীলগুলির প্রয়োজন সেগুলি থেকে আপনি সেটিংসে ডুব দেওয়া থেকে ভাল। সেক্ষেত্রে ভেরিয়েবলটি সমস্ত টেম্পলেটগুলিতে পাস করার অর্থ নেই। তবে আপনি যদি ভেরিয়েবলটিকে একটি বেস টেম্পলেট যেমন বেস হিটটিএমএল টেমপ্লেটে প্রেরণ করছেন তবে তা বেসিক হার্ট 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)

অথবা আপনি ব্যবহার করতে পারেন SITE_EXTRA_CONTEXT_DICTমধ্যে finalware এটা আপনার জন্য না।
un33k
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.