Django 2.1 - The Django template language

Django टेम्पलेट भाषा




django

Django टेम्पलेट भाषा

यह दस्तावेज़ Django टेम्पलेट सिस्टम की भाषा सिंटैक्स की व्याख्या करता है। यदि आप इस बारे में अधिक तकनीकी परिप्रेक्ष्य की तलाश कर रहे हैं कि यह कैसे काम करता है और इसे कैसे बढ़ाया जाए, तो Django टेम्पलेट भाषा देखें: पायथन प्रोग्रामर के लिए

Django की टेम्पलेट भाषा को शक्ति और सहजता के बीच संतुलन बनाने के लिए डिज़ाइन किया गया है। यह उन लोगों के लिए सहज महसूस करने के लिए डिज़ाइन किया गया है जो HTML के साथ काम करते थे। यदि आपके पास अन्य पाठ-आधारित टेम्प्लेट भाषाओं का कोई एक्सपोज़र है, जैसे कि Smarty या Jinja2 , तो आपको घर पर ही Django के टेम्प्लेट के साथ सही महसूस करना चाहिए।

दर्शन

यदि आपके पास प्रोग्रामिंग में कोई पृष्ठभूमि है, या यदि आप उन भाषाओं के लिए उपयोग किए जाते हैं जो प्रोग्रामिंग कोड को सीधे HTML में मिलाते हैं, तो आप यह ध्यान रखना चाहेंगे कि Django टेम्प्लेट सिस्टम केवल HTML में एम्बेडेड पायथन नहीं है। यह डिज़ाइन द्वारा है: टेम्पलेट सिस्टम प्रस्तुति को व्यक्त करने के लिए है, न कि प्रोग्राम लॉजिक के लिए।

Django टेम्प्लेट सिस्टम कुछ प्रोग्रामिंग कंस्ट्रक्शंस के समान टैग प्रदान करता है - if बूलियन टेस्ट के for एक टैग, लूपिंग के लिए एक टैग, आदि - लेकिन ये केवल इसी पायथन कोड के रूप में निष्पादित नहीं होते हैं, और टेम्प्लेट सिस्टम मनमाने ढंग से निष्पादित नहीं होगा। अजगर का भाव। केवल नीचे सूचीबद्ध टैग, फिल्टर और सिंटैक्स डिफ़ॉल्ट रूप से समर्थित हैं (हालाँकि आप आवश्यकतानुसार अपनी भाषा में अपने एक्सटेंशन जोड़ सकते हैं)।

टेम्पलेट्स

एक टेम्पलेट बस एक पाठ फ़ाइल है। यह किसी भी पाठ-आधारित प्रारूप (HTML, XML, CSV, आदि) को उत्पन्न कर सकता है।

एक टेम्प्लेट में वैरिएबल होते हैं , जो टेम्प्लेट का मूल्यांकन करने पर मूल्यों से बदल जाते हैं, और टैग , जो टेम्प्लेट के तर्क को नियंत्रित करते हैं।

नीचे एक न्यूनतम टेम्पलेट है जो कुछ मूल बातें दिखाता है। इस दस्तावेज़ में प्रत्येक तत्व को बाद में समझाया जाएगा।

{% extends "base_generic.html" %}

{% block title %}{{ section.title }}{% endblock %}

{% block content %}
<h1>{{ section.title }}</h1>

{% for story in story_list %}
<h2>
  <a href="{{ story.get_absolute_url }}">
    {{ story.headline|upper }}
  </a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}

दर्शन

XML- आधारित (जैसे Zope TAL) के बजाय पाठ-आधारित टेम्पलेट का उपयोग क्यों करें? हम चाहते थे कि Django की टेम्पलेट भाषा केवल XML / HTML टेम्प्लेट से अधिक के लिए प्रयोग करने योग्य हो। वर्ल्ड ऑनलाइन में, हम इसका उपयोग ईमेल, जावास्क्रिप्ट और सीएसवी के लिए करते हैं। आप किसी भी पाठ-आधारित प्रारूप के लिए टेम्पलेट भाषा का उपयोग कर सकते हैं।

ओह, और एक और बात: मनुष्य को एक्सएमएल संपादित करना दुखद है!

चर

चर इस तरह दिखते हैं: {{ variable }} । जब टेम्पलेट इंजन एक चर का सामना करता है, तो यह उस चर का मूल्यांकन करता है और परिणाम के साथ बदल देता है। चर नाम अल्फ़ान्यूमेरिक वर्णों और अंडरस्कोर ( "_" ) के किसी भी संयोजन से मिलकर बनता है, लेकिन अंडरस्कोर से शुरू नहीं हो सकता है। डॉट ( "." ) भी चर खंडों में दिखाई देता है, हालांकि इसका एक विशेष अर्थ है, जैसा कि नीचे दिखाया गया है। महत्वपूर्ण रूप से, आपके पास चर या विराम वर्ण चर नामों में नहीं हो सकते।

एक चर की विशेषताओं का उपयोग करने के लिए एक डॉट ( . ) का उपयोग करें।

परदे के पीछे

तकनीकी रूप से, जब टेम्प्लेट सिस्टम एक बिंदु से टकराता है, तो यह इस क्रम में निम्नलिखित लुकअप्स की कोशिश करता है:

  • शब्दकोश खोज
  • विशेषता या विधि खोज
  • न्यूमेरिक इंडेक्स लुकअप

यदि परिणामी मूल्य कॉल करने योग्य है, तो इसे बिना किसी तर्क के कहा जाता है। कॉल का परिणाम टेम्पलेट मान बन जाता है।

यह लुकअप ऑर्डर डिक्शनरी लुक ओवरराइड करने वाली वस्तुओं के साथ कुछ अप्रत्याशित व्यवहार का कारण बन सकता है। उदाहरण के लिए, निम्नलिखित कोड स्निपेट पर विचार करें जो एक collections.defaultdict पर लूप करने का प्रयास करता है।

{% for k, v in defaultdict.items %}
    Do something with k and v here...
{% endfor %}

क्योंकि डिक्शनरी लुकअप सबसे पहले होता है, यह व्यवहार इच्छित .items() पद्धति का उपयोग करने के बजाय एक डिफ़ॉल्ट मान प्रदान करता है। इस मामले में, पहले एक शब्दकोश में बदलने पर विचार करें।

उपरोक्त उदाहरण में, {{ section.title }} को section ऑब्जेक्ट के title विशेषता के साथ बदल दिया जाएगा।

यदि आप एक ऐसे चर का उपयोग करते हैं जो मौजूद नहीं है, तो टेम्पलेट सिस्टम string_if_invalid विकल्प का मान string_if_invalid , जो डिफ़ॉल्ट रूप से '' (खाली स्ट्रिंग) पर सेट है।

ध्यान दें कि {{ foo.bar }} जैसे टेम्पलेट अभिव्यक्ति में "बार" की व्याख्या एक शाब्दिक स्ट्रिंग के रूप में की जाएगी और यदि टेम्पलेट संदर्भ में मौजूद है तो "बार" के मान का उपयोग नहीं किया जाएगा।

परिवर्तनीय विशेषताएँ जो एक अंडरस्कोर से शुरू होती हैं, उन्हें एक्सेस नहीं किया जा सकता है क्योंकि वे आमतौर पर निजी मानी जाती हैं।

फिल्टर

आप फ़िल्टर का उपयोग करके प्रदर्शन के लिए चर को संशोधित कर सकते हैं।

फिल्टर इस तरह दिखते हैं: {{ name|lower }} । यह lower फ़िल्टर के माध्यम से फ़िल्टर किए जाने के बाद {{ name }} चर का मान प्रदर्शित करता है, जो पाठ को lower परिवर्तित करता है। फ़िल्टर लगाने के लिए एक पाइप ( | ) का उपयोग करें।

फिल्टर "जंजीर" हो सकते हैं। एक फिल्टर का आउटपुट अगले पर लागू होता है। {{ text|escape|linebreaks }} टेक्स्ट कॉन्टेंट से बचने के लिए एक सामान्य मुहावरा है, फिर लाइन ब्रेक को <p> टैग्स में परिवर्तित करना।

कुछ फिल्टर तर्क लेते हैं। एक फ़िल्टर तर्क इस तरह दिखता है: {{ bio|truncatewords:30 }} । यह bio चर के पहले 30 शब्दों को प्रदर्शित करेगा।

रिक्त स्थान वाले फ़िल्टर तर्क उद्धृत किए जाने चाहिए; उदाहरण के लिए, कॉमा और रिक्त स्थान वाली सूची में शामिल होने के लिए आप {{ list|join:", " }}

Django लगभग साठ बिल्ट-इन टेम्पलेट फिल्टर प्रदान करता है। आप उनके बारे में बिल्ट-इन फ़िल्टर संदर्भ में पढ़ सकते हैं। आपको जो उपलब्ध है, उसका स्वाद देने के लिए, यहां कुछ अधिक उपयोग किए जाने वाले टेम्पलेट फ़िल्टर दिए गए हैं:

default

यदि कोई चर गलत या खाली है, तो दिए गए डिफ़ॉल्ट का उपयोग करें। अन्यथा, चर के मूल्य का उपयोग करें। उदाहरण के लिए:

{{ value|default:"nothing" }}

यदि value प्रदान नहीं किया गया है या खाली है, तो ऊपर " nothing " प्रदर्शित होगा।

length

मान की लंबाई लौटाता है। यह स्ट्रिंग्स और सूचियों दोनों के लिए काम करता है। उदाहरण के लिए:

{{ value|length }}

यदि value ['a', 'b', 'c', 'd'] , तो आउटपुट 4 होगा।

filesizeformat

एक "मानव-पठनीय" फ़ाइल आकार (जैसे '13 KB' , '4.1 MB' , '102 bytes' , आदि) के मूल्य को '102 bytes' । उदाहरण के लिए:

{{ value|filesizeformat }}

यदि value 123456789 है, तो उत्पादन 117.7 MB

फिर, ये केवल कुछ उदाहरण हैं; पूरी सूची के लिए अंतर्निहित फ़िल्टर संदर्भ देखें

आप अपने स्वयं के कस्टम टेम्पलेट फ़िल्टर भी बना सकते हैं; कस्टम टेम्प्लेट टैग और फ़िल्टर देखें

यह भी देखें

Django के व्यवस्थापक इंटरफ़ेस में किसी दिए गए साइट के लिए उपलब्ध सभी टेम्प्लेट टैग और फ़िल्टर का पूरा संदर्भ शामिल हो सकता है। Django व्यवस्थापक प्रलेखन जनरेटर देखें।

टैग

टैग इस तरह दिखता है: {% tag %} । चर की तुलना में टैग अधिक जटिल होते हैं: कुछ आउटपुट में पाठ बनाते हैं, कुछ लूप या लॉजिक का प्रदर्शन करके नियंत्रण प्रवाह करते हैं, और कुछ बाहरी जानकारी को बाद के चर द्वारा उपयोग किए जाने वाले टेम्पलेट में लोड करते हैं।

कुछ टैग के लिए शुरुआत और समाप्ति टैग (यानी {% tag %} ... tag contents ... {% endtag %} ) की आवश्यकता होती है।

Django जहाजों के बारे में दो दर्जन निर्मित टेम्पलेट टैग के साथ। आप उनके बारे में बिल्ट-इन टैग संदर्भ में पढ़ सकते हैं। आपको जो उपलब्ध है, उसका स्वाद देने के लिए, यहां कुछ अधिक उपयोग किए जाने वाले टैग दिए गए हैं:

for

एक सरणी में प्रत्येक आइटम पर लूप। उदाहरण के लिए, athlete_list में athlete_list गए एथलीटों की सूची प्रदर्शित करने के लिए:

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>
if, elif, and else

एक चर का मूल्यांकन करता है, और यदि वह चर "सत्य" है, तो ब्लॉक की सामग्री प्रदर्शित होती है:

{% if athlete_list %}
    Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
    Athletes should be out of the locker room soon!
{% else %}
    No athletes.
{% endif %}

उपरोक्त में, यदि athlete_list खाली नहीं है, तो एथलीटों की संख्या {{ athlete_list|length }} चर द्वारा प्रदर्शित की जाएगी। अन्यथा, यदि athlete_in_locker_room_list खाली नहीं है, तो संदेश "एथलीट बाहर होना चाहिए ..." प्रदर्शित होगा। यदि दोनों सूचियां खाली हैं, तो "कोई एथलीट नहीं।" प्रदर्शित किया जाएगा।

यदि आप टैग में फ़िल्टर और विभिन्न ऑपरेटरों का उपयोग कर सकते हैं:

{% if athlete_list|length > 1 %}
   Team: {% for athlete in athlete_list %} ... {% endfor %}
{% else %}
   Athlete: {{ athlete_list.0.name }}
{% endif %}

जबकि उपरोक्त उदाहरण काम करता है, तो ध्यान रखें कि अधिकांश टेम्पलेट फ़िल्टर स्ट्रिंग को लौटाते हैं, इसलिए फ़िल्टर का उपयोग करने वाली गणितीय तुलना आमतौर पर आपकी अपेक्षा के अनुरूप काम नहीं करेगी। length एक अपवाद है।

block and extends
टेम्प्लेट इनहेरिटेंस (नीचे देखें) सेट करें, टेम्प्लेट में "बॉयलरप्लेट" को काटने का एक शक्तिशाली तरीका।

फिर, ऊपर केवल पूरी सूची का चयन है; पूरी सूची के लिए अंतर्निहित टैग संदर्भ देखें

आप अपने स्वयं के कस्टम टेम्पलेट टैग भी बना सकते हैं; कस्टम टेम्प्लेट टैग और फ़िल्टर देखें

यह भी देखें

Django के व्यवस्थापक इंटरफ़ेस में किसी दिए गए साइट के लिए उपलब्ध सभी टेम्प्लेट टैग और फ़िल्टर का पूरा संदर्भ शामिल हो सकता है। Django व्यवस्थापक प्रलेखन जनरेटर देखें।

टिप्पणियाँ

किसी टेम्प्लेट में किसी पंक्ति का हिस्सा-टिप्पणी करने के लिए, टिप्पणी वाक्यविन्यास का उपयोग करें: {# #}

उदाहरण के लिए, यह टेम्पलेट 'hello' रूप में प्रस्तुत करेगा:

{# greeting #}hello

एक टिप्पणी में कोई भी टेम्पलेट कोड हो सकता है, अमान्य या नहीं। उदाहरण के लिए:

{# {% if foo %}bar{% else %} #}

इस सिंटैक्स का उपयोग केवल एकल-पंक्ति टिप्पणियों के लिए किया जा सकता है ( {# और #} delimiters के बीच कोई नई रूपरेखा की अनुमति नहीं है)। यदि आपको टेम्पलेट के बहुस्तरीय भाग पर टिप्पणी करने की आवश्यकता है, तो comment टैग देखें।

खाका वंशानुक्रम

सबसे शक्तिशाली - और इस तरह सबसे जटिल - Django के टेम्पलेट इंजन का हिस्सा टेम्पलेट विरासत है। टेम्प्लेट इनहेरिटेंस आपको एक बेस "कंकाल" टेम्प्लेट बनाने की अनुमति देता है जिसमें आपकी साइट के सभी सामान्य तत्व होते हैं और ब्लॉक को परिभाषित करता है कि चाइल्ड टेम्प्लेट ओवरराइड कर सकते हैं।

उदाहरण के साथ शुरू करके टेम्पलेट विरासत को समझना सबसे आसान है:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css">
    <title>{% block title %}My amazing site{% endblock %}</title>
</head>

<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        {% endblock %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>

यह टेम्प्लेट, जिसे हम base.html कहेंगे, एक साधारण HTML कंकाल दस्तावेज़ को परिभाषित करता है, जिसे आप एक साधारण दो-स्तंभ पृष्ठ के लिए उपयोग कर सकते हैं। खाली ब्लॉकों को सामग्री से भरने के लिए यह "बच्चे" टेम्पलेट का काम है।

इस उदाहरण में, block टैग उन तीन ब्लॉकों को परिभाषित करता है जिन्हें चाइल्ड टेम्पलेट भर सकते हैं। सभी block टैग टेम्पलेट इंजन को यह बताने के लिए है कि चाइल्ड टेम्पलेट टेम्पलेट के उन हिस्सों को ओवरराइड कर सकता है।

एक बाल टेम्पलेट इस तरह दिख सकता है:

{% extends "base.html" %}

{% block title %}My amazing blog{% endblock %}

{% block content %}
{% for entry in blog_entries %}
    <h2>{{ entry.title }}</h2>
    <p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}

extends टैग यहाँ कुंजी है। यह टेम्प्लेट इंजन को बताता है कि यह टेम्प्लेट एक और टेम्प्लेट "विस्तारित" करता है। जब टेम्प्लेट सिस्टम इस टेम्प्लेट का मूल्यांकन करता है, तो सबसे पहले यह अभिभावक का पता लगाता है - इस मामले में, "base.html"।

उस बिंदु पर, टेम्पलेट इंजन base.html में तीन block टैग को नोटिस करेगा और उन ब्लॉक को चाइल्ड टेम्पलेट की सामग्री से बदल देगा। blog_entries के मूल्य के आधार पर, आउटपुट जैसा दिख सकता है:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css">
    <title>My amazing blog</title>
</head>

<body>
    <div id="sidebar">
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
    </div>

    <div id="content">
        <h2>Entry one</h2>
        <p>This is my first entry.</p>

        <h2>Entry two</h2>
        <p>This is my second entry.</p>
    </div>
</body>
</html>

ध्यान दें कि चूंकि चाइल्ड टेम्प्लेट ने sidebar ब्लॉक को परिभाषित नहीं किया है, इसलिए इसके बजाय पेरेंट टेम्पलेट से वैल्यू का उपयोग किया जाता है। पैरेंट टेम्प्लेट में {% block %} टैग के भीतर की सामग्री को हमेशा एक कमबैक के रूप में उपयोग किया जाता है।

आप आवश्यकता के अनुसार विरासत के कई स्तरों का उपयोग कर सकते हैं। वंशानुक्रम का उपयोग करने का एक सामान्य तरीका निम्नलिखित तीन-स्तरीय दृष्टिकोण है:

  • अपनी साइट का मुख्य लुक-एंड-होल्ड रखने वाला एक आधार। base.html टेम्प्लेट बनाएं।
  • अपनी साइट के प्रत्येक "अनुभाग" के लिए एक base_SECTIONNAME.html टेम्पलेट बनाएँ। उदाहरण के लिए, base_news.html , base_sports.html । ये टेम्पलेट सभी base.html विस्तार करते हैं और इसमें अनुभाग-विशिष्ट शैलियों / डिज़ाइन शामिल होते हैं।
  • प्रत्येक प्रकार के पृष्ठ के लिए अलग-अलग टेम्पलेट बनाएँ, जैसे कि समाचार लेख या ब्लॉग प्रविष्टि। ये टेम्पलेट उपयुक्त अनुभाग टेम्पलेट का विस्तार करते हैं।

यह दृष्टिकोण कोड पुन: उपयोग को अधिकतम करता है और साझा सामग्री क्षेत्रों में आइटम को जोड़ना आसान बनाता है, जैसे कि अनुभाग-वाइड नेविगेशन।

यहाँ विरासत के साथ काम करने के लिए कुछ सुझाव दिए गए हैं:

  • यदि आप किसी टेम्पलेट में extends का उपयोग करते हैं, तो यह उस टेम्पलेट में पहला टेम्पलेट टैग होना चाहिए। खाका वंशानुक्रम काम नहीं करेगा, अन्यथा।
  • आपके बेस टेम्प्लेट में अधिक block टैग बेहतर हैं। याद रखें, चाइल्ड टेम्प्लेट्स को सभी मूल ब्लॉकों को परिभाषित करने की आवश्यकता नहीं होती है, इसलिए आप कई ब्लॉक में उचित डिफॉल्ट भर सकते हैं, फिर केवल उन लोगों को परिभाषित करें जिनकी आपको बाद में आवश्यकता है। कम हुक की तुलना में अधिक हुक होना बेहतर है।
  • यदि आप कई सामग्रियों में खुद को डुप्लिकेट करने वाली सामग्री पाते हैं, तो इसका मतलब है कि आपको मूल कॉन्टेंट में उस सामग्री को {% block %} ले जाना चाहिए।
  • यदि आपको मूल टेम्पलेट से ब्लॉक की सामग्री प्राप्त करने की आवश्यकता है, तो {{ block.super }} वैरिएबल ट्रिक करेगा। यदि आप इसे पूरी तरह से ओवरराइड करने के बजाय पैरेंट ब्लॉक की सामग्री में जोड़ना चाहते हैं तो यह उपयोगी है। {{ block.super }} का उपयोग करके डाला गया डेटा स्वचालित रूप से बच नहीं जाएगा ( अगले खंड देखें), क्योंकि यह पहले से ही बच गया था, यदि आवश्यक हो, तो मूल टेम्पलेट में।
  • टेम्पलेट टैग as सिंटैक्स के as उपयोग करके एक block के बाहर बनाए गए चर block अंदर उपयोग नहीं किए जा सकते हैं। उदाहरण के लिए, यह टेम्पलेट कुछ भी प्रस्तुत नहीं करता है:

    {% trans "Title" as title %}
    {% block content %}{{ title }}{% endblock %}
    
  • अतिरिक्त पठनीयता के लिए, आप वैकल्पिक रूप से अपने {% endblock %} टैग को एक नाम दे सकते हैं। उदाहरण के लिए:

    {% block content %}
    ...
    {% endblock content %}
    

    बड़े टेम्प्लेट में, यह तकनीक आपको यह देखने में मदद करती है कि कौन से {% block %} टैग बंद किए जा रहे हैं।

अंत में, ध्यान दें कि आप एक ही टेम्पलेट में एक ही नाम के साथ कई block टैग को परिभाषित नहीं कर सकते हैं। यह सीमा मौजूद है क्योंकि एक ब्लॉक टैग "दोनों" दिशाओं में काम करता है। यही है, एक ब्लॉक टैग केवल भरने के लिए एक छेद प्रदान नहीं करता है - यह उस सामग्री को भी परिभाषित करता है जो माता-पिता के छेद को भरता है। यदि किसी टेम्प्लेट में दो समान रूप से block टैग होते हैं, तो उस टेम्प्लेट के माता-पिता को यह नहीं पता होगा कि ब्लॉक की सामग्री में से कौन सा उपयोग करना है।

स्वचालित HTML बच रहा है

टेम्पलेट से HTML बनाते समय, हमेशा एक जोखिम होता है कि एक चर में ऐसे अक्षर शामिल होंगे जो परिणामी HTML को प्रभावित करते हैं। उदाहरण के लिए, इस टेम्पलेट के टुकड़े पर विचार करें:

Hello, {{ name }}

पहले तो, यह उपयोगकर्ता के नाम को प्रदर्शित करने के लिए एक हानिरहित तरीका लगता है, लेकिन विचार करें कि यदि उपयोगकर्ता ने अपना नाम इस रूप में दर्ज किया तो क्या होगा:

<script>alert('hello')</script>

इस नाम मान के साथ, टेम्प्लेट को निम्नानुसार प्रस्तुत किया जाएगा:

Hello, <script>alert('hello')</script>

... जिसका अर्थ है कि ब्राउज़र एक जावास्क्रिप्ट अलर्ट बॉक्स को पॉप-अप करेगा!

इसी तरह, अगर नाम में '<' चिन्ह होता है, तो क्या होता है?

<b>username

यह इस तरह एक प्रदान की गई टेम्पलेट में परिणाम होगा:

Hello, <b>username

... जो, बदले में, शेष वेब पेज को बोल्ड किया जाएगा!

स्पष्ट रूप से, उपयोगकर्ता द्वारा प्रस्तुत डेटा पर आँख बंद करके भरोसा नहीं किया जाना चाहिए और सीधे आपके वेब पृष्ठों में डाला जाना चाहिए, क्योंकि दुर्भावनापूर्ण उपयोगकर्ता संभावित रूप से बुरे काम करने के लिए इस तरह के छेद का उपयोग कर सकता है। इस प्रकार के सुरक्षा शोषण को क्रॉस साइट स्क्रिप्टिंग (XSS) हमला कहा जाता है।

इस समस्या से बचने के लिए, आपके पास दो विकल्प हैं:

  • एक, आप escape फिल्टर (नीचे प्रलेखित) के माध्यम से प्रत्येक अविश्वास चर को चलाने के लिए सुनिश्चित कर सकते हैं, जो संभावित हानिकारक HTML वर्णों को धर्मी लोगों में परिवर्तित करता है। यह Django में अपने पहले कुछ वर्षों के लिए डिफ़ॉल्ट समाधान था, लेकिन समस्या यह है कि यह आप , डेवलपर / टेम्पलेट लेखक पर यह सुनिश्चित करता है कि आप सब कुछ से बच रहे हैं। डेटा बचाना भूल जाना आसान है।
  • दो, आप Django के स्वचालित HTML से बचने का लाभ उठा सकते हैं। इस खंड के शेष भाग में बताया गया है कि कैसे ऑटो-भागने का काम करता है।

Django में डिफ़ॉल्ट रूप से, प्रत्येक टेम्पलेट स्वचालित रूप से प्रत्येक चर टैग के आउटपुट से बच जाता है। विशेष रूप से, ये पाँच वर्ण बच गए हैं:

  • < को &lt;
  • > को &gt;
  • ' (एकल उद्धरण) को &#39; परिवर्तित किया गया है &#39;
  • " (दोहरा उद्धरण) को &quot;
  • & &amp; में परिवर्तित किया गया है &amp;

फिर, हम इस बात पर जोर देते हैं कि यह व्यवहार डिफ़ॉल्ट रूप से है। यदि आप Django के टेम्पलेट सिस्टम का उपयोग कर रहे हैं, तो आप सुरक्षित हैं।

इसे कैसे बंद किया जाए

यदि आप नहीं चाहते हैं कि डेटा प्रति-साइट, प्रति-टेम्पलेट स्तर या प्रति-चर स्तर पर ऑटो-एस्केप हो, तो आप इसे कई तरीकों से बंद कर सकते हैं।

आप इसे बंद क्यों करना चाहेंगे? क्योंकि कभी-कभी, टेम्प्लेट चर में डेटा होता है जिसे आप कच्चे एचटीएमएल के रूप में प्रस्तुत करना चाहते हैं, इस स्थिति में आप नहीं चाहते कि उनकी सामग्री बच जाए। उदाहरण के लिए, आप अपने डेटाबेस में HTML का एक ब्लो स्टोर कर सकते हैं और इसे सीधे अपने टेम्पलेट में एम्बेड करना चाहते हैं। या, आप उदाहरण के लिए, ई-मेल संदेश की तरह HTML - पाठ का उत्पादन करने के लिए Django के टेम्पलेट सिस्टम का उपयोग कर रहे होंगे।

अलग-अलग चर के लिए

व्यक्तिगत चर के लिए ऑटो-भागने को अक्षम करने के लिए, safe फ़िल्टर का उपयोग करें:

This will be escaped: {{ data }}
This will not be escaped: {{ data|safe }}

आगे भागने से सुरक्षित के लिए शॉर्टहैंड के रूप में सुरक्षित के बारे में सोचो या एचटीएमएल के रूप में सुरक्षित रूप से व्याख्या की जा सकती है । इस उदाहरण में, यदि data में '<b>' , तो आउटपुट होगा:

This will be escaped: &lt;b&gt;
This will not be escaped: <b>

टेम्पलेट ब्लॉक के लिए

किसी टेम्प्लेट के लिए ऑटो- autoescape को autoescape लिए, autoescape टैग में टेम्प्लेट (या सिर्फ एक विशेष अनुभाग) को autoescape , जैसे:

{% autoescape off %}
    Hello {{ name }}
{% endautoescape %}

autoescape टैग अपने तर्क के रूप में या तो off या लेता है। कई बार, जब आप अन्यथा अक्षम हो जाते हैं, तो आप ऑटो से बचने के लिए मजबूर कर सकते हैं। यहाँ एक उदाहरण टेम्पलेट है:

Auto-escaping is on by default. Hello {{ name }}

{% autoescape off %}
    This will not be auto-escaped: {{ data }}.

    Nor this: {{ other_data }}
    {% autoescape on %}
        Auto-escaping applies again: {{ name }}
    {% endautoescape %}
{% endautoescape %}

ऑटो-एस्केप टैग उन टेम्प्लेट पर अपना प्रभाव डालता है जो वर्तमान को और साथ ही सभी ब्लॉक टैग की तरह include टैग के माध्यम से include किए गए टेम्पलेट्स का विस्तार करते हैं। उदाहरण के लिए:

{% autoescape off %}
<h1>{% block title %}{% endblock %}</h1>
{% block content %}
{% endblock %}
{% endautoescape %}
{% extends "base.html" %}
{% block title %}This &amp; that{% endblock %}
{% block content %}{{ greeting }}{% endblock %}

क्योंकि ऑटो-बेसिंग को बेस टेम्प्लेट में बंद कर दिया गया है, इसलिए इसे चाइल्ड टेम्प्लेट में भी बंद कर दिया जाएगा, जिसके परिणामस्वरूप निम्नलिखित HTML का greeting होता है जब greeting वेरिएबल में स्ट्रिंग <b>Hello!</b> :

<h1>This &amp; that</h1>
<b>Hello!</b>

टिप्पणियाँ

आम तौर पर, टेम्पलेट लेखकों को ऑटो-भागने के बारे में बहुत चिंता करने की ज़रूरत नहीं है। पायथन साइड पर डेवलपर्स (विचार और कस्टम फ़िल्टर लिखने वाले लोगों) को उन मामलों के बारे में सोचने की ज़रूरत है जिनमें डेटा को बचाना नहीं चाहिए, और डेटा को उचित रूप से चिह्नित करना चाहिए, इसलिए चीजें बस टेम्पलेट में काम करती हैं।

यदि आप एक ऐसा टेम्प्लेट बना रहे हैं, जिसका उपयोग उन स्थितियों में किया जा सकता है, जहां आपको यकीन नहीं है कि ऑटो-एसेडिंग सक्षम है, तो किसी भी वैरिएबल में एक escape फ़िल्टर जोड़ें, जिसमें escape आवश्यकता हो। जब ऑटो-भागने की प्रक्रिया होती है, तो escape फ़िल्टर डबल-भागने वाले डेटा का कोई खतरा नहीं होता है - escape फ़िल्टर ऑटो-एस्केप किए गए चर को प्रभावित नहीं करता है।

स्ट्रिंग शाब्दिक और स्वचालित भागने

जैसा कि हमने पहले बताया, फ़िल्टर तर्क तार हो सकते हैं:

{{ data|default:"This is a string literal." }}

सभी स्ट्रिंग शाब्दिक को टेम्पलेट में किसी भी स्वचालित भागने के बिना डाला जाता है - वे ऐसे कार्य करते हैं जैसे कि वे सभी safe फिल्टर के माध्यम से पारित किए गए थे। इसके पीछे तर्क यह है कि टेम्पलेट लेखक स्ट्रिंग शाब्दिक में जाने के नियंत्रण में है, इसलिए वे यह सुनिश्चित कर सकते हैं कि टेम्पलेट लिखे जाने पर पाठ सही ढंग से बच गया है।

इसका मतलब है आप लिखेंगे

{{ data|default:"3 &lt; 2" }}

…बजाय:

{{ data|default:"3 < 2" }}  {# Bad! Don't do this. #}

यह प्रभावित नहीं करता है कि चर से आने वाले डेटा का क्या होता है। चर की सामग्री अभी भी स्वचालित रूप से बच जाती है, यदि आवश्यक हो, क्योंकि वे टेम्पलेट लेखक के नियंत्रण से परे हैं।

एक्सेस करने का तरीका

वस्तुओं से जुड़ी अधिकांश विधि कॉल भी टेम्प्लेट के भीतर से उपलब्ध हैं। इसका मतलब यह है कि टेम्पलेट्स में क्लास की विशेषताओं (जैसे फ़ील्ड नाम) और विचारों से पारित होने वाले चर की तुलना में बहुत अधिक पहुंच है। उदाहरण के लिए, Django ORM विदेशी कुंजी पर संबंधित वस्तुओं का संग्रह खोजने के लिए “entry_set” सिंटैक्स प्रदान करता है। इसलिए, "कार्य" नामक एक मॉडल के लिए एक विदेशी कुंजी संबंध के साथ "टिप्पणी" नामक एक मॉडल दिया गया है, आप इस तरह दिए गए कार्य से जुड़ी सभी टिप्पणियों के माध्यम से लूप कर सकते हैं:

{% for comment in task.comment_set.all %}
    {{ comment }}
{% endfor %}

इसी तरह, QuerySets उन वस्तुओं की संख्या की गणना करने के लिए एक count() विधि प्रदान करता है जिसमें वे होते हैं। इसलिए, आप वर्तमान कार्य से संबंधित सभी टिप्पणियों की एक संख्या प्राप्त कर सकते हैं:

{{ task.comment_set.all.count }}

और निश्चित रूप से आप आसानी से अपने स्वयं के मॉडल पर स्पष्ट रूप से परिभाषित तरीकों का उपयोग कर सकते हैं:

class Task(models.Model):
    def foo(self):
        return "bar"
{{ task.foo }}

क्योंकि Django जानबूझकर टेम्प्लेट लैंग्वेज में उपलब्ध लॉजिक प्रोसेसिंग की मात्रा को सीमित करता है, टेम्प्लेट के भीतर से एक्सेस किए गए मेथड कॉल के लिए तर्कों को पास करना संभव नहीं है। डेटा को विचारों में गणना की जानी चाहिए, फिर प्रदर्शन के लिए टेम्प्लेट में पारित किया गया।

कस्टम टैग और फिल्टर लाइब्रेरी

कुछ एप्लिकेशन कस्टम टैग और फ़िल्टर लाइब्रेरी प्रदान करते हैं। उन्हें एक टेम्पलेट में एक्सेस करने के लिए, सुनिश्चित करें कि आवेदन INSTALLED_APPS (हम इस उदाहरण के लिए 'django.contrib.humanize' ), और फिर एक टेम्पलेट में load टैग का उपयोग करें:

{% load humanize %}

{{ 45000|intcomma }}

उपरोक्त में, load टैग humanize टैग लाइब्रेरी को load करता है, जो तब उपयोग के लिए intcomma फ़िल्टर उपलब्ध करता है। यदि आपने django.contrib.admindocs सक्षम django.contrib.admindocs , तो आप अपने इंस्टॉलेशन में कस्टम लाइब्रेरी की सूची ढूंढने के लिए अपने व्यवस्थापक के दस्तावेज़ क्षेत्र से परामर्श कर सकते हैं।

load टैग कई लाइब्रेरी नामों को ले सकता है, जिन्हें रिक्त स्थान द्वारा अलग किया गया है। उदाहरण:

{% load humanize i18n %}

अपने स्वयं के कस्टम टेम्पलेट लायब्रेरी लिखने की जानकारी के लिए कस्टम टेम्प्लेट टैग और फ़िल्टर देखें।

कस्टम पुस्तकालयों और टेम्पलेट विरासत

जब आप कोई कस्टम टैग या फ़िल्टर लाइब्रेरी लोड करते हैं, तो टैग / फ़िल्टर केवल वर्तमान टेम्पलेट के लिए ही उपलब्ध कराए जाते हैं - टेम्पलेट-इनहेरिटेंस पथ के साथ कोई भी माता-पिता या बच्चे टेम्पलेट नहीं।

उदाहरण के लिए, यदि एक टेम्पलेट foo.html में {% load humanize %} foo.html {% load humanize %} , तो एक बाल टेम्पलेट (उदाहरण के लिए, जिसमें {% extends "foo.html" %} ) का {% extends "foo.html" %} टेम्पलेट टैग और फ़िल्टर तक पहुंच नहीं होगी। चाइल्ड टेम्प्लेट अपने स्वयं के {% load humanize %} लिए जिम्मेदार है।

यह स्थिरता और पवित्रता के लिए एक विशेषता है।

यह भी देखें

टेम्प्लेट संदर्भ
बिल्ट-इन टैग, बिल्ट-इन फिल्टर, एक वैकल्पिक टेम्पलेट, भाषा, और अधिक का उपयोग कर कवर करता है।