2012-03-19 15 views
13

का उपयोग करने के लिए जब मैं ब्लॉग एप्लिकेशन में Django के क्लास आधारित जेनेरिक दृश्यों का उपयोग कर रहा हूं। मेरे विचारों में से एक पोस्ट की एक सूची प्रदर्शित करता है जिसमें एक निश्चित टैग होता है। मैं इस दृश्य को टैग द्वारा फ़िल्टर किए गए पदों के ListView के रूप में लिख सकता हूं। या मैं इस दृश्य को टैग के DetailView के रूप में लिख सकता हूं, और संदर्भ में प्रासंगिक पोस्ट जोड़ सकता हूं।Django जेनेरिक दृश्य: ListView बनाम DetailView

एक और तरीका उचित है - या पाइथोनिक - दूसरे की तुलना में?

ListView दृष्टिकोण अधिक अर्थपूर्ण प्रतीत होता है, क्योंकि जो मैं चाहता हूं वह सूची पदों की सूची है, लेकिन यह थोड़ा और जटिल भी है। यह आवश्यक है कि मैं दो तरीकों को ओवरराइट करता हूं। DetailView दृष्टिकोण केवल मुझे एक विधि को ओवरराइट करने की आवश्यकता है।

class PostTagView(ListView): 
    """Display all blog posts with a given tag.""" 
    queryset = Post.objects.published() 

    def get_context_data(self, **kwargs): 
     context = super(PostTagView, self).get_context_data(**kwargs) 
     context['tag'] = get_object_or_404(Tag, slug=self.kwargs['slug']) 
     return context 

    def get_queryset(self, **kwargs): 
     queryset = super(PostTagView, self).get_queryset() 
     return queryset.filter(tags__slug=self.kwargs['slug']) 


class TagDetailView(DetailView): 
    """Display all blog posts with a given tag.""" 
    model = Tag 

    def get_context_data(self, **kwargs): 
     context = super(TagDetailView, self).get_context_data(**kwargs) 
     context['object_list'] = Post.objects.published().filter(tags__slug=self.kwargs['slug']) 
     return context 

उत्तर

6

अंगूठे के नियम के रूप में, यूआरएल में पैरामीटर देखें। यदि आप Tag के slug का उपयोग कर रहे हैं तो आप DetailView से अधिकतर ListView से निपटने की संभावना रखते हैं।

इस मामले में, दूसरा दृष्टिकोण कम कोड का उपयोग करता है और यह अधिक सुरुचिपूर्ण है। हालांकि, यह भी इस बात पर निर्भर करता है कि आप बाद में दृश्य के साथ क्या करने जा रहे हैं। यदि आप पोस्ट को संपादित करने के लिए फॉर्म जोड़ने जा रहे हैं, तो इसके बजाय ListView का उपयोग करने का अर्थ हो सकता है। लेकिन एक दूसरे को पसंद करने के लिए कोई तकनीकी कारण नहीं है, यह सिर्फ इतना है कि आप दूसरे दृष्टिकोण की तुलना में एक दृष्टिकोण में अधिक कोड लिखना समाप्त कर सकते हैं।

+1

यूआरएल पैरामीटर के साथ मिलान करना समझ में आता है। – user1272534

+0

ग्रेट उत्तर। अब आप इसे कैसे पगड़ेंगे? सूची दृश्य का उपयोग करना, यह छोटा है। इसे विस्तार से देखने के रूप में, मैं खो गया :( –

+2

@ डैनगैले: एक 'DetailView' को अंकनित नहीं किया जाना चाहिए, इसका उद्देश्य केवल एक ऑब्जेक्ट के साथ उपयोग करना है। –

1

दिलचस्प सवाल। दुर्भाग्य से, जवाब काफी दिलचस्प नहीं है: जो भी आपके और आपके ऐप के लिए सबसे ज्यादा समझ में आता है। किसी भी दृष्टिकोण के लिए तर्क समान रूप से किए जा सकते हैं, इसलिए यह वास्तव में सिर्फ एक निर्णय कॉल है।

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