आपका स्वागत है! क्लास बेस्ड व्यूज़ (इसके बाद CBV) के बारे में लेखों की एक श्रृंखला की निरंतरता में, हम वस्तुओं को संपादित करने वाले सेक्शन में जाते हैं। इस लेख में, हम बोलने वाले नामों के साथ चार वर्गों पर विचार करेंगे: FormView, CreateView, UpdateView, DeleteView।
भाग 1 ,
भाग 2 ,
भाग 3 ,
भाग 4CBV का उपयोग करके एक फॉर्म बनाना और संपादित करना
कई कार्यों के लिए, चाहे वह साइट पर पंजीकरण या प्राधिकरण हो, समाचार प्रकाशित करना हो, टिप्पणियां प्रकाशित करना हो या सामान को स्टोर में जोड़ना हो, बिना फॉर्म के ऐसा करना असंभव है। Django में प्रपत्र बनाने के लिए एक सार्वभौमिक उपकरण के रूप में, FormView वर्ग कार्य करता है। सबसे सरल स्थिति में, एक व्यावहारिक रूप बनाने के लिए, आपको बस इसे केवल उस वर्ग के लिए लिंक देने की आवश्यकता है जो आवश्यक रूप का वर्णन करता है:
from django.views.generic.edit import FormView class RegisterForm(FormView): form_class = Register success_url = '/thanks/'
या हमारे urlconf में FormView वर्ग के एक उदाहरण के लिए आवश्यक डेटा को सीधे पास करें:
url(r'^register/$', FormView.as_view(form_class=Register, success_url='/thanks/')
नोट: उदाहरण सिंथेटिक है और निश्चित रूप से, यह पंजीकरण पृष्ठ के लिए इस रूप में उपयोग नहीं किया जा सकता है।
प्रपत्र वर्ग जिसे संसाधित करने की आवश्यकता होती है, उसे
get_form_class विधि द्वारा वापस कर दिया
जाता है। डिफ़ॉल्ट रूप से, यह विधि
form_class विशेषता को
लौटाती है, जिसके लिए हमने ऊपर दिए गए उदाहरण में अपने फॉर्म का वर्ग सौंपा है। यदि हम प्रपत्र वर्ग की परिभाषा में अधिक जटिल तर्क की आवश्यकता है, तो हम इस पद्धति को ओवरराइड कर सकते हैं।
Get_success_url विधि एक url लिंक लौटाती है जिससे आप प्रपत्र के सफल प्रसंस्करण के बाद
पुनर्निर्देशित हो जाएंगे। डिफ़ॉल्ट रूप से, यह विधि
success_url विशेषता देता है।
प्रपत्र फ़ील्ड के लिए डिफ़ॉल्ट मान निर्दिष्ट करने के लिए, हम उन्हें
प्रारंभिक विशेषता से सीधे पारित कर सकते हैं, जो एक शब्दकोश है जिसकी कुंजी में आवश्यक फ़ॉर्म फ़ील्ड के नाम होने चाहिए। इस विशेषता का मान
get_initial विधि के साथ डिफ़ॉल्ट रूप से वापस आ जाता है।
अक्सर कुछ डेटा को फ़ॉर्म में स्थानांतरित करने की आवश्यकता होती है, उदाहरण के लिए, उपयोगकर्ता ऑब्जेक्ट या अनुभागों की पूर्वनिर्धारित सूची। इस क्रिया के लिए
get_form_kwargs विधि उपयुक्त है। इस पद्धति को ओवरराइड करते समय, आपको सावधानीपूर्वक डिफ़ॉल्ट रूप में सबमिट किए गए डेटा को फिर से लिखना नहीं चाहिए। उनमें से हैं:
def get_form_kwargs(self): """ """ kwargs = {'initial': self.get_initial()} if self.request.method in ('POST', 'PUT'): kwargs.update({ 'data': self.request.POST, 'files': self.request.FILES, }) return kwargs
इस डेटा को खोने से बचने के लिए, हमें पहले मूल वर्ग से शब्दकोश प्राप्त करना होगा, फिर उसमें आवश्यक डेटा जोड़ना होगा:
class ProductForm(FormView): def get_form_kwargs(self): kwargs = super(ProductForm, self).get_form_kwargs() kwargs.update({ 'sections': Section.objects.filter(is_active=True) }) return kwargs
हमारे फॉर्म की कक्षा प्राप्त करने के लिए, हम
get_form पद्धति का उपयोग कर सकते हैं, जो डिफ़ॉल्ट रूप से
फॉर्म_क्लास विधि के माध्यम से निर्दिष्ट फॉर्म क्लास देता है, जिसके साथ
get_form_kwargs शब्दकोश पास किया जाता है:
def get_form(self, form_class): return form_class(**self.get_form_kwargs())
फ़ॉर्म को संसाधित करते समय, यदि सफल हो, तो Django हमारे प्रदर्शन की
form_valid विधि को कॉल करता है। डिफ़ॉल्ट रूप से, यह विधि
get_success_url विधि द्वारा दिए गए लिंक पर पुनर्निर्देशित
करती है।
मामले में जब
फॉर्म में गलत डेटा
जमा किया जाता है , तो
form_invalid विधि को
कहा जाता है , जो डिफ़ॉल्ट रूप से उपयोगकर्ता को फॉर्म पेज पर वापस लौटाता है, इसे सत्यापन त्रुटियों की सूची के साथ एक ऑब्जेक्ट पास करता है।
class CreatePost(FormView): form_class = PostForm template_name = 'create_post.html' success_url = '/success/' @method_decorator(login_required) def dispatch(self, request, *args, **kwargs): super(CreatePost, self).dispatch(request, *args, **kwargs) def form_valid(self, form): Post.objects.create(**form.cleaned_data) return redirect(self.get_success_url())
अब रूपों के आवेदन के विभिन्न क्षेत्रों पर अधिक विस्तार से विचार करें।
ऑब्जेक्ट की एक नई आवृत्ति बनाएँ
उपरोक्त उदाहरण का उपयोग करके, हम आसानी से एक नया लेख ऑब्जेक्ट बना सकते हैं, हालांकि Django में ऑब्जेक्ट को और भी अधिक आसानी के साथ बनाने के लिए उपकरण हैं, यह
CreateView क्लास है। इस वर्ग का उपयोग करने के लिए, इसके पास दिया गया प्रपत्र ModelForm से प्राप्त होना चाहिए:
from django import forms class NewsForm(forms.ModelForm): class Meta(object): model = News exclude = ('status',)
अब हम इस फॉर्म के ऑब्जेक्ट को अपनी मैपिंग में स्थानांतरित कर सकते हैं। प्रदर्शन उदाहरण पिछले वाले के समान ही है:
from django.views.generic.edit import CreateView class CreateNews(CreateView): form_class = NewsForm template_name = 'create_news.html' succes_url = '/success/' def form_valid(self, form): Post.objects.create(**form.cleaned_data) return redirect(self.get_success_url())
यदि मॉडल को बचाने से पहले और अधिक जटिल कार्यों को करना आवश्यक है (विदेशी कुंजियों को नीचे रखें, अतिरिक्त जानकारी जोड़ें), तो ऐसा करने के लिए निम्नलिखित उदाहरण अधिक उपयुक्त तरीका होगा (धन्यवाद
मार्जमिकी के लिए )
def form_valid(self, form):
नोट: Form_valid पद्धति को परिभाषित करना अनावश्यक हो सकता है, क्योंकि CreateView को ModelFormMixin विरासत में मिली है, जो स्वचालित रूप से ऑब्जेक्ट के एक उदाहरण को फॉर्म से बचाता है।
त्रुटि से निपटने के लिए,
form_invalid पद्धति का भी उपयोग किया जाता है, जिसकी कार्यक्षमता FormView वर्ग के समान है।
किसी वस्तु का उदाहरण देना
UpdateView वर्ग और CreateView के बीच मुख्य अंतर इस वर्ग की
वस्तु विशेषता के लिए परस्पर वस्तु के उदाहरण का स्थानांतरण है, अन्यथा कक्षाएं समान हैं। संपादन के लिए, हमें केवल URL की प्राथमिक कुंजी या स्लग को उत्परिवर्तित वस्तु के पास करना होगा:
CreateView वर्ग के लिए फ़ॉर्म और मॉडल का वर्णन समान दिखता है।
किसी ऑब्जेक्ट की आवृत्ति को हटाना
किसी ऑब्जेक्ट को हटाने के लिए मैपिंग लॉजिक इस आलेख में चर्चा की गई पिछली कक्षाओं से कुछ अलग है। सुरक्षा कारणों से, किसी ऑब्जेक्ट को हटाना, किसी पोस्ट को हटाने या अनुरोध को हटाने के बाद ही उपलब्ध होता है। अनुरोध प्राप्त होने की स्थिति में, ऑब्जेक्ट हटाने की पुष्टि वाला एक पृष्ठ प्रदर्शित किया जाएगा। सबसे न्यूनतर संस्करण में, यह सबमिट बटन और सीएसआरएफ टोकन के साथ एक रूप हो सकता है:
<form action="" method="post"> {% csrf_token %} <button></button> </form>
मैपिंग इस तरह दिख सकती है:
from django.views.generic.edit import DeleteView class ItemDelete(DeleteView): model = Item template_name = 'item_confirm_delete.html' success_url = '/success/'
बेशक, यदि आपको उपयोगकर्ता प्राधिकरण या उपयुक्त अधिकारों के लिए उचित जांच की आवश्यकता है, तो आप इसे डिस्पैच विधि के लिए सज्जाकार का उपयोग कर सकते हैं या अपना स्वयं का सत्यापन तर्क जोड़ सकते हैं:
from django.views.generic.edit import DeleteView class ItemDelete(DeleteView): model = Item template_name = 'item_confirm_delete.html' success_url = '/success/' @method_decorator(login_required) def dispatch(self, request, *args, **kwargs): super(ItemDelete, self).dispatch(request, *args, **kwargs)
इस लेख में, हमने रूपों और प्रबंध वस्तुओं के साथ काम करने की जांच की, यदि आपके कोई प्रश्न हैं, तो मैं या अन्य पाठक, मुझे आशा है, उनका उत्तर दे सकते हैं। मैं आपसे किसी भी त्रुटि या अशुद्धियों की सूचना देने के लिए कहता हूं और यदि मुझे कुछ याद है तो लेख में जानकारी जोड़ने के लिए सुझाव। लेख पढ़ने के लिए धन्यवाद और आपको शुभकामनाएं =)