2012-08-26 14 views
5

मैं एक दृश्य लिख रहा हूं जो ListView से विरासत में है, और लॉग-इन उपयोगकर्ताओं को दृश्य को प्रतिबंधित करने का प्रयास कर रहा हूं।सजावट वाले वर्ग-आधारित विचारों के दो तरीकों के बीच क्या अंतर है?

https://docs.djangoproject.com/en/dev/topics/class-based-views/#decorating-in-urlconf कहता है कि URLconf में login_required लॉगिन के साथ सजावट "प्रति-उदाहरण के आधार पर सजावटी को लागू करती है। यदि आप एक दृश्य के हर उदाहरण को सजाए रखना चाहते हैं, तो आपको एक अलग दृष्टिकोण लेना होगा" - सजाने के लिए यह दृष्टिकोण दृश्य कोड में प्रेषण विधि।

मैंने सोचा कि मुझे कक्षा और एक उदाहरण के बीच का अंतर पता था लेकिन इस वाक्यांश का मतलब मेरे लिए कुछ भी नहीं है। क्या कोई स्पष्टीकरण दे सकता है? URL वर्ग में सजावट करने के अलावा आपकी कक्षा परिभाषा के विपरीत, दोनों दृष्टिकोणों के बीच अंतर क्या हैं?

उस लिंक के ऊपर पैराग्राफ इस प्रश्न का उत्तर देने लगता है: "चूंकि वर्ग-आधारित विचार कार्य नहीं कर रहे हैं, इसलिए सजाने के रूप में आप अलग-अलग काम करते हैं, यदि आप as_view का उपयोग कर रहे हैं या सबक्लास बना रहे हैं।"

वास्तव में ?? मैं ListView के अपने उप-वर्ग के साथ URLconf दृष्टिकोण का उपयोग करने में सक्षम होने लगता हूं।

उत्तर

5

कल्पना कीजिए कि आप निम्नलिखित वर्ग आधारित दृश्य है:

class PostListView(ListView): 
    model = Post 

ProtectedPostListView = login_required(PostListView.as_view()) 

और अपने urls.py:

url(r'posts$', ProtectedPostListView) 

आप तो यह तरीका अपनाते हैं आप उपवर्ग को ProtectedPostListView जैसे

क्षमता खो देते हैं
class MyNewView(ProtectedPostListView): 
    #IMPOSSIBLE 

और ऐसा इसलिए है क्योंकि .as_view() एक फ़ंक्शन देता है और login_required सजावट लगाने के बाद आपको एक फ़ंक्शन के साथ छोड़ दिया जाता है, इसलिए सबक्लासिंग संभव नहीं है।

दूसरी तरफ यदि आप दूसरे दृष्टिकोण के साथ जाते हैं तो मैं विधि सजावट का उपयोग करता हूं, सबक्लासिंग संभव है। उदाहरण

class PostListView(ListView): 
    model = Post 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(PostListView, self).dispatch(*args, **kwargs) 

class MyNewView(PostListView): 
    #LEGAL 
संबंधित मुद्दे