Django 2.1 - Class-based views

वर्ग-आधारित विचार




django

वर्ग-आधारित विचार

एक दृश्य एक कॉल करने योग्य है जो एक अनुरोध लेता है और एक प्रतिक्रिया देता है। यह केवल एक फ़ंक्शन से अधिक हो सकता है, और 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 हेडर इंगित करता है कि जब सबसे हालिया पुस्तक प्रकाशित हुई थी। इस जानकारी के आधार पर, क्लाइंट पूरी ऑब्जेक्ट सूची को डाउनलोड कर सकता है या नहीं भी कर सकता है।