Django 2.1 - Class-based views
वर्ग-आधारित विचार

वर्ग-आधारित विचार
एक दृश्य एक कॉल करने योग्य है जो एक अनुरोध लेता है और एक प्रतिक्रिया देता है। यह केवल एक फ़ंक्शन से अधिक हो सकता है, और Django कुछ वर्गों का एक उदाहरण प्रदान करता है जिसे विचारों के रूप में उपयोग किया जा सकता है। ये आपको अपने विचारों की संरचना करने और विरासत और मिश्रण का उपयोग करके कोड का पुन: उपयोग करने की अनुमति देते हैं। सरल कार्यों के लिए कुछ सामान्य विचार भी हैं जो हमें बाद में मिलेंगे, लेकिन आप पुन: प्रयोज्य विचारों की अपनी संरचना को डिज़ाइन करना चाह सकते हैं जो आपके उपयोग के मामले के अनुकूल हो। पूर्ण विवरण के लिए, वर्ग-आधारित विचार संदर्भ प्रलेखन देखें ।
- वर्ग-आधारित विचारों का परिचय
- बिल्ट-इन क्लास-आधारित जेनेरिक विचार
- क्लास-आधारित विचारों के साथ फॉर्म हैंडलिंग
- वर्ग-आधारित विचारों के साथ मिश्रण का उपयोग करना
मूल उदाहरण
Django बेस व्यू क्लासेस प्रदान करता है जो आवेदनों की एक विस्तृत श्रृंखला के अनुरूप होगा।
सभी दृश्य
View
क्लास से विरासत में मिले हैं, जो कि व्यू को यूआरएल, एचटीटीपी मेथड डिस्पैचिंग और अन्य सरल सुविधाओं से जोड़ता है।
RedirectView
एक साधारण HTTP रीडायरेक्ट के लिए है, और
TemplateView
व्यू बेस क्लास को बढ़ाता है ताकि यह टेम्प्लेट को रेंडर भी कर सके।
आपके URLconf में सरल उपयोग
जेनेरिक विचारों का उपयोग करने का सबसे सरल तरीका उन्हें सीधे आपके URLconf में बनाना है।
यदि आप केवल क्लास-आधारित दृश्य पर कुछ सरल विशेषताओं को बदल रहे हैं, तो आप उन्हें
as_view()
पद्धति में स्वयं कॉल कर सकते हैं:
from django.urls import path from django.views.generic import TemplateView urlpatterns = [ path('about/', TemplateView.as_view(template_name="about.html")), ]
as_view()
को
as_view()
गए कोई भी तर्क वर्ग पर सेट की गई विशेषताओं को ओवरराइड कर देगा।
इस उदाहरण में, हम
TemplateView
को
TemplateView
पर सेट करते हैं।
RedirectView
पर
url
विशेषता के लिए एक समान ओवरराइडिंग पैटर्न का उपयोग किया जा सकता है।
उपहास के सामान्य विचार
जेनेरिक विचारों का उपयोग करने के लिए दूसरा, अधिक शक्तिशाली तरीका एक मौजूदा दृश्य से विरासत में मिला है और नए मान या तरीके प्रदान करने के लिए आपके उपवर्ग में विशेषताओं (जैसे
template_name
) या विधियों (जैसे
get_context_data
) को
get_context_data
करना है।
उदाहरण के लिए, एक ऐसा विचार, जो सिर्फ एक टेम्पलेट को प्रदर्शित करता है,
about.html
।
Django के पास ऐसा करने के लिए एक सामान्य दृश्य है -
TemplateView
- इसलिए हम इसे केवल उप-वर्ग कर सकते हैं, और टेम्पलेट नाम को ओवरराइड कर सकते हैं:
# some_app/views.py from django.views.generic import TemplateView class AboutView(TemplateView): template_name = "about.html"
फिर हमें बस इस नए दृश्य को अपने URLconf में जोड़ना होगा।
TemplateView
एक वर्ग है, एक फ़ंक्शन नहीं है, इसलिए हम इसके बजाय URL को
as_view()
क्लास विधि की
as_view()
इंगित करते हैं, जो क्लास-आधारित विचारों के लिए फ़ंक्शन जैसी प्रविष्टि प्रदान करता है:
# urls.py from django.urls import path from some_app.views import AboutView urlpatterns = [ path('about/', AboutView.as_view()), ]
अंतर्निहित सामान्य विचारों के उपयोग के बारे में अधिक जानकारी के लिए, सामान्य वर्ग-आधारित विचारों पर अगले विषय पर परामर्श करें।
अन्य HTTP तरीकों का समर्थन
मान लीजिए कि कोई व्यक्ति API के रूप में विचारों का उपयोग करके HTTP पर हमारी पुस्तक लाइब्रेरी तक पहुंचना चाहता है। एपीआई क्लाइंट हर अब और फिर कनेक्ट करेगा और पिछली यात्रा के बाद से प्रकाशित पुस्तकों के लिए पुस्तक डेटा डाउनलोड करेगा। लेकिन अगर तब से कोई नई किताबें दिखाई नहीं देती हैं, तो डेटाबेस से पुस्तकों को लाने के लिए सीपीयू समय और बैंडविड्थ की बर्बादी होती है, एक पूर्ण प्रतिक्रिया प्रदान करें और इसे क्लाइंट को भेजें। सबसे हाल की पुस्तक प्रकाशित होने पर एपीआई से पूछना बेहतर हो सकता है।
URL को हम URLconf में सूची दृश्य बुक करने के लिए मैप करते हैं:
from django.urls import path from books.views import BookListView urlpatterns = [ path('books/', BookListView.as_view()), ]
और दृश्य:
from django.http import HttpResponse from django.views.generic import ListView from books.models import Book class BookListView(ListView): model = Book def head(self, *args, **kwargs): last_book = self.get_queryset().latest('publication_date') response = HttpResponse('') # RFC 1123 date format response['Last-Modified'] = last_book.publication_date.strftime('%a, %d %b %Y %H:%M:%S GMT') return response
यदि दृश्य को
GET
अनुरोध से एक्सेस किया जाता है, तो प्रतिक्रिया में एक सादा और सरल ऑब्जेक्ट सूची वापस आ जाती है (
book_list.html
टेम्पलेट का उपयोग करके)।
लेकिन अगर क्लाइंट एक
HEAD
अनुरोध जारी करता है, तो प्रतिक्रिया में एक खाली निकाय है और
Last-Modified
हेडर इंगित करता है कि जब सबसे हालिया पुस्तक प्रकाशित हुई थी।
इस जानकारी के आधार पर, क्लाइंट पूरी ऑब्जेक्ट सूची को डाउनलोड कर सकता है या नहीं भी कर सकता है।