2012-04-26 11 views
13

के लिए जेनेरिक व्यू क्लासेस का विस्तार करना मैं लगातार अपने कई विचारों के संदर्भ में एक ही अतिरिक्त चर जोड़ने के लिए देखता हूं।सामान्य get_context_data

def get_context_data(self, **kwargs): 
    # Call the base implementation first to get a context 
    context = super(MyListView, self).get_context_data(**kwargs) 
    # Add in the house 
    context['house'] = self.get_object().house 
    return context 

मैं अपने आप को दोहरा पसंद नहीं है के रूप में, मैंने सोचा कि मैं दृश्य का विस्तार एक नया वर्ग बना सकते हैं और उसके बाद मैं नए विस्तारित दृश्य वर्ग पर अपने सभी विचारों का आधार हो सकता है। बात यह है कि, मेरे द्वारा उपयोग किए जाने वाले 4 वर्ग दृश्य हैं: CreateView, UpdateView, ListView और DeleteView। क्या मुझे वास्तव में उनमें से प्रत्येक के लिए एक नई कक्षा बनाना है?

क्या डीजेंगो "बेस" व्यू क्लास की तरह कुछ नहीं है? शायद यह करने का एक अच्छा तरीका है? अग्रिम में बहुत धन्यवाद!

+0

यह एक संभावित समाधान है हालांकि मुझे यकीन नहीं है कि मैं इस पर उत्सुक हूं - http://reinout.vanrees.org/weblog/2014/05/19/context.html – rix

उत्तर

19

एक Mixin बनाएँ:

from django.views.generic.base import ContextMixin 

class HouseMixin(ContextMixin): 
    def get_house(self): 
    # Get the house somehow 
    return house 

    def get_context_data(self, **kwargs): 
    ctx = super(HouseMixin, self).get_context_data(**kwargs) 
    ctx['house'] = self.get_house() 
    return ctx 

फिर अपने अन्य वर्गों में आप एकाधिक वंशानुक्रम का उपयोग करेंगे:

class HouseEditView(HouseMixin, UpdateView): 
    pass 

class HouseListView(HouseMixin, ListView): 
    pass 

और इतने पर है, तो इन सभी दृश्यों संदर्भ में house होगा।

+3

वाह यह वास्तव में काम करता है! मैंने सोचा (सुपरमिक्सिन, स्वयं) .get_context_data (** kwargs) एक त्रुटि लौटाएगा, क्योंकि हाउसमिक्सिन का सुपर ऑब्जेक्ट है और ऑब्जेक्ट get_context_data को परिभाषित नहीं किया गया है। क्या आप मुझे समझा सकते हैं कि यह क्यों काम करता है? – Clash

+3

यह तब तक काम करता है जब तक कि अभिभावक वर्गों में से एक विधि को लागू नहीं करता है, अगर कोई नहीं होता है, तो यह एक त्रुटि उठाएगा। तो इस मिश्रण को किसी भी Django व्यू के साथ मिश्रित करने के लिए डिज़ाइन किया गया है जो .get_context_data() लागू करता है। –

+1

क्या कक्षाओं को विस्तारित करने के क्रम में ऐसा करना है? यानी हाउसमिक्सिन, अपडेटव्यू के बजाय अपडेटव्यू, हाउसमिक्सिन – Clash