2011-09-05 8 views
5

मैं अपनी परियोजना में कक्षा-आधारित विचार पेश करने की कोशिश कर रहा हूं। अब तक अच्छा लगा, जब तक मुझे निम्न समस्या नहीं मिली।मैं Django में कक्षा-आधारित विचारों में `as_view` को ओवरराइड कैसे करूं?

मैं ब्रेडक्रंब बनाने के लिए django-navigation का उपयोग कर रहा हूं। यह इस तरह काम करता है: एक दृश्य समारोह सजाया जाता है और यह सजावट उस समारोह पर एक विशेषता प्रस्तुत करती है जिसे breadcrumb कहा जाता है। टेम्पलेट में, वर्तमान यूआरएल या उसके हिस्से को हल किया जाता है और परिणामी दृश्य इस विशेषता के लिए चेक किया जाता है। यदि यह वहां है, तो इसका मूल्यांकन किया जाता है और परिणाम ब्रेडक्रंब टेक्स्ट होता है।

चूंकि वर्ग-आधारित विचारों को आम तौर पर as_view() विधि द्वारा दर्शाया जाता है, ऐसा लगता है कि मुझे इसे सजाने की आवश्यकता होगी, हालांकि, यह एक क्लास विधि है, इसलिए मैं वास्तव में उस उदाहरण का उपयोग नहीं कर सकता, जिस पर मेरा ब्रेडक्रंब कोर्स निर्भर करता है पर।

breadcrumbas_view() को __init__() में विशेषता को काम नहीं किया, या मुझे वाक्यविन्यास गलत मिला। EDIT: बेशक यह काम नहीं करता है, क्योंकि मैंने इसे as_view से जोड़ा है, इसके वापसी मूल्य के लिए नहीं।

कोई विचार है कि उस ब्रेडक्रंब सजावट और कक्षा-आधारित विचारों को सही तरीके से कैसे एकीकृत किया जाए?

उत्तर

1

मुझे लगता है कि आप urls.py में कुछ इस तरह कर सकता है:

the_view = ListView.as_view(...) 
the_view = the_decroator(the_view) 

urlpatterns = patterns('', 
    url(r'^$', the_view, name='app_index'), 
    ... 
) 

as_view विधि एक प्रतिदेय देता है, और उस से सजाया जा सकता है। '@' - सिंटैक्स लाइन 2 पर क्या किया जाता है, इसके लिए सिर्फ एक शॉर्टकट है।

+0

क्या आप इसे एक ही पंक्ति में कर सकते हैं? 'url (r'^$ ', the_decorator (ListView.as_view()), name =' app_index ')'? –

+0

हां, आप कर सकते हैं :) – nfg

8

मैंने इसे इस तरह हल कर लिया है। मैंने अपने breadcrumb दिनचर्या को एक बाल वर्ग पर एक विधि में रखा है और मेरे मूल दृश्य में as_view ओवरराइड किया है। self पॉइंटर प्राप्त करने के लिए वास्तविक as_view से भी एक चाल का उपयोग किया।

@classonlymethod 
def as_view(cls, **initkwargs): 
    self = cls(**initkwargs) 
    view = super(MyBaseView, cls).as_view(**initkwargs) 
    if hasattr(self, 'breadcrumb') and callable(getattr(self, 'breadcrumb', None)): 
     return breadcrumb(self.breadcrumb)(view) 
    return view 
संबंधित मुद्दे