2013-02-11 13 views
8

कक्षा आधारित विचारों से पहले एक अतिरिक्त_कॉन्क्स्ट कीवर्ड था जिसे urlsconf में पारित किया जा सकता है। https://docs.djangoproject.com/en/1.3/topics/generic-views/#adding-extra-contextकक्षा आधारित जेनेरिक विचार अतिरिक्त संदर्भ

अब वर्ग आधारित सामान्य विचारों के साथ, अगर हम भी ऐसा ही करना चाहते हैं हम सामान्य दृश्य उपवर्ग को https://docs.djangoproject.com/en/1.3/topics/class-based-views/#adding-extra-context

हम कुछ सरल चाहते हैं है, और हम सामान्य CreateView और UpdateView उपयोग कर रहे हैं। यह दृष्टिकोण कुछ ऐसा करने के लिए मजबूर होगा जो पहले छोटा था। और भी, हमें दो बार ऐसा करने, डीआरवाई सिद्धांत को तोड़ना है।

ऐसा क्यों है? क्या कोई कारण है कि हम अतिरिक्त संदर्भ सीधे टेम्पलेट पर क्यों नहीं पारित कर सकते हैं?

धन्यवाद

उत्तर

13

बहुत अधिक विचारों के बाद, एकमात्र उत्तर नहीं है, कार्यक्षमता हटा दी गई थी।

और दस्तावेज़ीकरण में "हटाई गई सुविधा" का उल्लेख नहीं है और इसमें कोई स्पष्टीकरण नहीं है कि यह ऐसा क्यों था।

लेकिन मेरे जीवन बनाने के लिए आसान मैं @aidan से सलाह मान ली और एक छोटा सा संशोधित

class ExtraContext(object): 
    extra_context = {} 

    def get_context_data(self, **kwargs): 
     context = super(ExtraContext, self).get_context_data(**kwargs) 
     context.update(self.extra_context) 
     return context 

class ExtraListView(ExtraContext, ListView): 
    pass 

class ExtraDetailView(ExtraContext, DetailView): 
    pass 

class ExtraUpdateView(ExtraContext, UpdateView): 
    pass 

class ExtraCreateView(ExtraContext, CreateView): 
    pass 

class ExtraDeleteView(ExtraContext, DeleteView): 
    pass 

class ExtraCloneView(ExtraUpdateView): 
    def post(self, request, *args, **kwargs): 
     return ExtraCreateView.as_view(model=self.model, 
           template_name=self.template_name, 
           extra_context=self.extra_context)(request, *args, **kwargs)  
अब मैं अर्द्ध सामान्य दृश्य दिखाई देते हैं कि मैं URLSconf में सीधे इस्तेमाल करते हैं और करने के लिए extra_context dict पारित कर सकते हैं

as_view() फोन

url(r'^camera/(?P<pk>\d+)/$', 
    views.ExtraDetailView.as_view(model=models.Camera, 
           extra_context={'action_type': 'detail', 'mod_name' : 'camera'}, 
           template_name='cameras/camera_detail.html'), 
    name='camera_detail'), 
+0

खुशी मैं मदद कर सकता था। –

+0

इस समाधान के लिए आपको बहुत बहुत धन्यवाद, मैंने लगभग सभी परियोजनाओं को यूआरएल पर कक्षा आधारित जेनेरिक विचारों के आसपास बनाया है, और इसके बिना मुझे सब कुछ बदलना होगा – guinunez

8

मुझे लगता है कि यह काफी इतना आसान नहीं है, लेकिन यह अभी भी कोड का केवल 5 लाइनों है -

class MyView(CreateView): 
    def get_context_data(self, *args, **kwargs): 
     context = super(MyView, self).get_context_data(*args, **kwargs) 
     context['my_additional_context'] = my_object 
     return context 

तुम सच में वर्ग आधारित विचारों के साथ कि कार्यक्षमता चाहते हैं, तो शायद आप का विस्तार कर सकता है वर्ग में जोड़ने के लिए -

class MyCreateView(CreateView) 
    additional_context = {} 
    def get_context_data(self, *args, **kwargs): 
     context = super(MyView, self).get_context_data(*args, **kwargs) 
     context.append(self.additional_context) 
     return context 

फिर अपने url_conf में इसका इस्तेमाल करते हैं -

urlpatterns = patterns('', 
    #.... 
    (r'^my_url/$', MyCreateView.as_view(additional_context={'my_addional_context': my_object})), 
) 

आप अपना खुद का CreateView, DetailView, ListView आदि लिख सकते हैं और उन्हें अपने द्वारा प्रोजेक्ट में आयात कर सकते हैं।

+0

समस्या यह नहीं है कि यह सामान्य विचारों को उप-वर्गीकृत कैसे करें, समस्या यह है कि यह कार्यक्षमता हटा दी गई थी। – fariza

+0

हाँ, मुझे लगता है। मेरे पास वास्तव में आपके प्रश्न का उत्तर नहीं है। मुझे नहीं पता कि इसे क्यों हटा दिया गया था। –

+0

यह काम करेगा, लेकिन एक पुराना Django नियम है "यूआरएल फाइल में यूआरएल विचारों को कुछ भी पास न करें!" यह धीमा कर देगा!django (एक पुस्तक) के दो स्कूप्स से संसाधन –

5

ऊपर जवाब पढ़ना, ऐसा लग रहा था कि इस दृष्टिकोण, समस्या को हल करते समय, अनिवार्य रूप से पुराने कार्यक्षमता वापस लाने के लिए एक हैक किया गया था। एक छोटे से googling generic class-based views page लाया, जिसमें "adding extra context" शीर्षक वाला एक अनुभाग शामिल है। बस यहाँ संक्षेप में प्रस्तुत करने, समाधान बस get_context_data() का अपना स्वयं का संस्करण है जो चर आप टेम्पलेट्स को भेजना चाहते हैं को शामिल किया जाएगा लागू करने के लिए है:

from django.views.generic import DetailView 
from books.models import Publisher, Book 

class PublisherDetail(DetailView): 

    model = Publisher 

    def get_context_data(self, **kwargs): 
     # Call the base implementation first to get a context 
     context = super(PublisherDetail, self).get_context_data(**kwargs) 
     # Add in a QuerySet of all the books 
     context['book_list'] = Book.objects.all() 
     return context 

यहां सबसे बड़ा लाभ यह है कि आप "हैक" की आवश्यकता नहीं है urls.py संदर्भ तर्कों के सभी प्रकारों को शामिल करने के लिए, आप क्लास-आधारित दृश्यों द्वारा प्रदान की गई सभी कार्यक्षमताओं का लाभ उठा सकते हैं जबकि अभी भी कस्टम-परिभाषित संदर्भ सामग्री प्रदान करते हैं।

+0

क्या यह वास्तव में स्वीकार्य उत्तर नहीं है? – fariza

+0

@ फ़ारिज़ा - कोड समान है, अंतर दृष्टिकोण है। स्वीकार्य उत्तर उपरोक्त कोड का उपयोग 'as_view' (यदि मैं इसे सही ढंग से समझ रहा हूं) को पास करने के लिए करता हूं। यह 'urls.py' में कुछ भी संशोधित करने की आवश्यकता के बिना, टेम्पलेट को सीधे तर्कों को पारित करने के लिए कोड का उपयोग करने का सुझाव देता है। – eykanal

+0

मूल प्रश्न हटाए गए कार्यक्षमता और इसे वापस लाने के बारे में था। उस कार्यक्षमता ने सामान्य विचारों को इंगित किया जो urls.py से अतिरिक्त संदर्भ स्वीकार करते थे – fariza

संबंधित मुद्दे