Django
templating
खोज…
चर
आपके द्वारा अपने संदर्भ के संदर्भ में दिए गए चर को डबल-ब्रेस नोटेशन का उपयोग करके एक्सेस किया जा सकता है:
आपके views.py
:
class UserView(TemplateView):
""" Supply the request user object to the template """
template_name = "user.html"
def get_context_data(self, **kwargs):
context = super(UserView, self).get_context_data(**kwargs)
context.update(user=self.request.user)
return context
user.html
:
<h1>{{ user.username }}</h1>
<div class="email">{{ user.email }}</div>
डॉट नोटेशन एक्सेस करेगा:
- ऑब्जेक्ट के गुण, जैसे
user.username
{{ user.username }}
- शब्दकोश लुकअप, उदाहरण के लिए
request.GET["search"]
{{ request.GET.search }}
- बिना तर्क वाली विधियाँ, उदाहरण के लिए
users.count()
{{ user.count }}
टेम्प्लेट चर उन तरीकों का उपयोग नहीं कर सकते हैं जो तर्क लेते हैं।
चर भी परीक्षण और पर पाला जा सकता है:
{% if user.is_authenticated %}
{% for item in menu %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endfor %}
{% else %}
<li><a href="{% url 'login' %}">Login</a>
{% endif %}
URL को {% url 'name' %}
प्रारूप का उपयोग करके एक्सेस किया जाता है, जहाँ नाम आपके urls.py
में नामों के अनुरूप होते हैं।
{% url 'login' %}
- संभवतः /accounts/login/
रूप में प्रस्तुत करेगा
{% url 'user_profile' user.id %}
- URL के लिए तर्क क्रम में दिए गए हैं
{% url next %}
- URL चर हो सकते हैं
क्लास बेस्ड व्यू में टेंपलेटिंग
आप कस्टम चर में टेम्पलेट में डेटा पास कर सकते हैं।
आपके views.py
:
from django.views.generic import TemplateView
from MyProject.myapp.models import Item
class ItemView(TemplateView):
template_name = "item.html"
def items(self):
""" Get all Items """
return Item.objects.all()
def certain_items(self):
""" Get certain Items """
return Item.objects.filter(model_field="certain")
def categories(self):
""" Get categories related to this Item """
return Item.objects.get(slug=self.kwargs['slug']).categories.all()
आपके item.html
में एक साधारण सूची। item.html
:
{% for item in view.items %}
<ul>
<li>{{ item }}</li>
</ul>
{% endfor %}
आप डेटा के अतिरिक्त गुणों को भी पुनः प्राप्त कर सकते हैं।
मान लें कि आपका मॉडल Item
का name
फ़ील्ड है:
{% for item in view.certain_items %}
<ul>
<li>{{ item.name }}</li>
</ul>
{% endfor %}
फंक्शन आधारित दृश्यों में अस्थायी
आप फ़ंक्शन आधारित दृश्य में एक टेम्पलेट का उपयोग इस प्रकार कर सकते हैं:
from django.shortcuts import render
def view(request):
return render(request, "template.html")
यदि आप टेम्पलेट चर का उपयोग करना चाहते हैं, तो आप निम्नानुसार कर सकते हैं:
from django.shortcuts import render
def view(request):
context = {"var1": True, "var2": "foo"}
return render(request, "template.html", context=context)
फिर, template.html
, आप अपने चर को इस तरह संदर्भित कर सकते हैं:
<html>
{% if var1 %}
<h1>{{ var2 }}</h1>
{% endif %}
</html>
खाका फिल्टर
Django टेम्प्लेट सिस्टम में अंतर्निहित टैग और फ़िल्टर हैं , जो एक विशिष्ट तरीके से सामग्री को प्रस्तुत करने के लिए टेम्पलेट के अंदर कार्य करते हैं। पाइप और फिल्टर के साथ कई फिल्टर निर्दिष्ट किए जा सकते हैं, जैसे कि तर्क वाक्य विन्यास में हो सकते हैं।
{{ "MAINROAD 3222"|lower }} # mainroad 3222
{{ 10|add:15}} # 25
{{ "super"|add:"glue" }} # superglue
{{ "A7"|add:"00" }} # A700
{{ myDate | date:"D d M Y"}} # Wed 20 Jul 2016
उपलब्ध बिल्ट-इन फिल्टरों की एक सूची https://docs.djangoproject.com/en/dev/ref/templates/builtins/#ref-templates-builtins-filters पर देखी जा सकती है।
कस्टम फ़िल्टर बनाना
अपने स्वयं के टेम्प्लेट फ़िल्टर जोड़ने के लिए, अपने ऐप फ़ोल्डर के अंदर templatetags
नाम का एक फ़ोल्डर बनाएं। फिर एक __init__.py
जोड़ें, और आपकी फ़ाइल में वह फ़ाइल होगी जिसमें फ़िल्टर होंगे:
#/myapp/templatetags/filters.py
from django import template
register = template.Library()
@register.filter(name='tostring')
def to_string(value):
return str(value)
वास्तव में फिल्टर का उपयोग करने के लिए आपको इसे अपने टेम्पलेट में लोड करना होगा:
#templates/mytemplate.html
{% load filters %}
{% if customer_id|tostring = customer %} Welcome back {% endif%}
ट्रिक्स
भले ही फ़िल्टर पहली बार में सरल लगे, लेकिन यह कुछ निफ्टी चीजों को करने की अनुमति देता है:
{% for x in ""|ljust:"20" %}Hello World!{% endfor %} # Hello World!Hello World!Hel...
{{ user.name.split|join:"_" }} ## replaces whitespace with '_'
अधिक जानकारी के लिए टेम्प्लेट टैग भी देखें।
संवेदनशील तरीकों को टेम्प्लेट में बुलाए जाने से रोकें
जब कोई वस्तु टेम्प्लेट के संदर्भ में सामने आती है, तो उसके तर्क-विधियाँ उपलब्ध होती हैं। यह उपयोगी है जब ये फ़ंक्शन "गेटर्स" होते हैं। लेकिन यह खतरनाक हो सकता है अगर ये विधियां कुछ डेटा को बदल देती हैं या कुछ दुष्प्रभाव होते हैं। अंततः आपको खाका लेखक पर भरोसा होने की संभावना है, वह किसी फ़ंक्शन के दुष्प्रभावों से अवगत नहीं हो सकता है या गलती से गलत विशेषता को बुला सकता है।
निम्नलिखित मॉडल को देखते हुए:
class Foobar(models.Model):
points_credit = models.IntegerField()
def credit_points(self, nb_points=1):
"""Credit points and return the new points credit value."""
self.points_credit = F('points_credit') + nb_points
self.save(update_fields=['points_credit'])
return self.points_credit
यदि आप इसे गलती से, किसी टेम्पलेट में लिखते हैं:
You have {{ foobar.credit_points }} points!
यह प्रत्येक बार टेंपलेट कहे जाने वाले अंकों की संख्या में वृद्धि करेगा। और आप इसे नोटिस भी नहीं कर सकते हैं।
इसे रोकने के लिए, आपको साइड इफेक्ट्स वाले तरीकों के लिए True
पर alters_data
विशेषता सेट करना होगा। इससे उन्हें टेम्प्लेट से कॉल करना असंभव हो जाएगा।
def credit_points(self, nb_points=1):
"""Credit points and return the new points credit value."""
self.points_credit = F('points_credit') + nb_points
self.save(update_fields=['points_credit'])
return self.points_credit
credit_points.alters_data = True
{% का विस्तार%}, {% में%} और {% ब्लॉक%} का उपयोग है
सारांश
{% का विस्तार%} : यह वर्तमान टेम्पलेट के माता-पिता के रूप में दिए गए टेम्पलेट को एक तर्क के रूप में घोषित करता है। उपयोग:
{% extends 'parent_template.html' %}
।{% ब्लॉक%} {% एंडब्लॉक%} : इसका उपयोग आपके टेम्प्लेट में अनुभागों को परिभाषित करने के लिए किया जाता है, ताकि यदि कोई अन्य टेम्पलेट इसको विस्तारित करता है, तो यह जो भी HTML कोड इसके अंदर लिखा गया है, उसे प्रतिस्थापित करने में सक्षम होगा। ब्लॉक उनके नाम से पहचाने जाते हैं। उपयोग:
{% block content %} <html_code> {% endblock %}
।{% में%} शामिल हैं : यह वर्तमान के भीतर एक टेम्पलेट सम्मिलित करेगा। ध्यान रखें कि शामिल टेम्पलेट को अनुरोध का संदर्भ प्राप्त होगा, और आप इसे कस्टम चर भी दे सकते हैं। मूल उपयोग:
{% include 'template_name.html' %}
, चर के साथ उपयोग:{% include 'template_name.html' with variable='value' variable2=8 %}
मार्गदर्शक
मान लीजिए कि आप सभी कोड के लिए सामान्य लेआउट होने के साथ अपने फ्रंट एंड साइड कोड का निर्माण कर रहे हैं और आप हर टेम्पलेट के लिए कोड को दोहराना नहीं चाहते हैं। Django आपको ऐसा करने के लिए निर्मित टैग में देता है।
मान लीजिए हमारे पास एक ब्लॉग वेबसाइट है जिसमें 3 टेम्पलेट हैं जो समान लेआउट साझा करते हैं:
project_directory
..
templates
front-page.html
blogs.html
blog-detail.html
1) base.html
फ़ाइल को परिभाषित करें,
<html>
<head>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
2) इसे blog.html
में blog.html
जैसे,
{% extends 'base.html' %}
{% block content %}
# write your blog related code here
{% endblock %}
# None of the code written here will be added to the template
यहाँ हमने आधार लेआउट का विस्तार किया है इसलिए इसका HTML लेआउट अब blog.html
। blog.html
फ़ाइल में उपलब्ध है। { % block %}
की अवधारणा टेम्पलेट उत्तराधिकार है जो आपको एक आधार "कंकाल" टेम्पलेट बनाने की अनुमति देता है जिसमें आपके सभी सामान्य तत्व शामिल होते हैं। साइट और ब्लॉक को परिभाषित करता है कि बच्चे के टेम्पलेट ओवरराइड कर सकते हैं।
3) अब मान लें कि आपके सभी 3 टेम्पलेटों में भी एक ही HTML div है जो कुछ लोकप्रिय पोस्टों को परिभाषित करता है। 3 बार लिखे जाने के बावजूद एक नया टेम्पलेट posts.html
बनाने posts.html
। posts.html
blog.html
{% extends 'base.html' %}
{% block content %}
# write your blog related code here
{% include 'posts.html' %} # includes posts.html in blog.html file without passing any data
<!-- or -->
{% include 'posts.html' with posts=postdata %} # includes posts.html in blog.html file with passing posts data which is context of view function returns.
{% endblock %}