Django में कक्षा के विचार

Django view points to a function, which can be a problem if you want to change only a bit of functionality. Yes, I could have million keyword arguments and even more if statements in the function, but I was thinking more of an object oriented approach.

उदाहरण के लिए, मेरे पास एक पृष्ठ है जो उपयोगकर्ता को प्रदर्शित करता है। यह पृष्ठ पृष्ठ के समान है जो एक समूह प्रदर्शित करता है, लेकिन यह अभी भी एक और डेटा मॉडल का उपयोग करने के समान नहीं है। समूह के सदस्यों आदि भी है ...

एक तरीका क्लास विधियों के विचारों को इंगित करना होगा और फिर उस वर्ग को विस्तारित करना होगा। क्या किसी ने इस दृष्टिकोण की कोशिश की है या कोई अन्य विचार है?

0
जोड़ा संपादित
विचारों: 1
निश्चित रूप से, धन्यवाद एलेक्स। मैं कुछ भूल जाता हूँ। :-)
जोड़ा लेखक engtech, स्रोत
@ जॉर्ज 2: क्या आप कृपया अपने पुराने प्रश्नों की समीक्षा कर सकते हैं और किसी भी ऐसे व्यक्ति की जांच कर सकते हैं जिसे उत्तर के रूप में चिह्नित किया जाना चाहिए? अगर आपको वह जवाब प्राप्त नहीं हुए हैं जिन्हें आप चाहते हैं, तो कृपया अपने प्रश्नों को संपादित और स्पष्ट करें। धन्यवाद!!
जोड़ा लेखक Alex Angas, स्रोत

10 उत्तर

मैंने इनके साथ कुछ खेला है और अतीत में कुछ उपयोगी दस्तावेज पाए हैं।

उस पर रोबोट फ़ोरम देखें।

मूल रूप से रोबोट पर 'घर' नौकरी चलाते हैं, आपको प्रत्येक धुरी से पूर्ण स्थिति की आवश्यकता होती है और यह नियंत्रक के अंदर एक स्टिकर पर पाई जाती है। घर की स्थिति में आपके पास आवंटित सभी रेफरी तीर होना चाहिए।

यदि घर की स्थिति खो गई है तो एन्कोडर मेमोरी गुम हो गई है। यह प्रत्येक क्रांति के लिए 4000 अंक की गणना करता है - यदि एन्कोडर ज्ञापन खो जाता है तो यह नहीं जानता कि कितने पास हुए हैं।

नए और पुराने एन्कोडर घर की स्थिति के बीच अंतर लें और 4000 तक विभाजित करें - यह आपको बताएगा कि यह कितना है।

दिया गया उदाहरण था:

मूल घर एन्कोडर गिनती: -119771 नई होम एन्कोडर गिनती (संदर्भ चिह्नों को रेखांकित करने और उस धुरी के लिए डेटा सेट करने के बाद): -95834 अंतर: -23937 4000 से विभाजित: 5.9 8425 इसलिए, क्रांति की संख्या 6 थी मेरी नई घर की स्थिति फिर -119771 + (6) एक्स (4000) = -95771 हो

4
जोड़ा

सामग्री क्वेरी वेब पार्ट देखें।

3
जोड़ा
हाँ माफ करना एक बैठक के रास्ते में जल्दी में था! thx kusek
जोड़ा लेखक Anonymous User, स्रोत
@ जॉर्ज आप इसके लिए एक नया प्रश्न खोलने की आवश्यकता हो सकती है। लेकिन मैं आपको सामग्री क्वेरी वेब पार्ट के लिए यहां जवाब दूंगा। blogs.msdn.com/ecm/archive/2006/10/25/…
जोड़ा लेखक Isaac Moses, स्रोत
धन्यवाद एंडर्स! क्या आप मुझे "सामग्री क्वेरी वेब पार्ट" का उपयोग करने के बारे में अधिक जानकारी दिखा सकते हैं ताकि एक सूची बनाने के लिए जो माता-पिता साइट और बाल साइट दोनों में दिखाया जा सके (उसी सामग्री को दिखाने के लिए)?
जोड़ा लेखक engtech, स्रोत

जेनेरिक विचार आमतौर पर जाने का तरीका होंगे, लेकिन आखिरकार आप यूआरएल को संभालने के लिए स्वतंत्र हैं, हालांकि आप चाहते हैं। FormWizard क्लास-आधारित तरीके से चीजें करता है, जैसा कि रीस्टफुल एपीआई के लिए कुछ ऐप्स करते हैं।

मूल रूप से एक यूआरएल के साथ आपको एक कॉल करने योग्य प्रदान करने के लिए चर और स्थान का एक गुच्छा दिया जाता है, जो आप प्रदान करते हैं वह पूरी तरह से आपके ऊपर है - मानक तरीका एक कार्य प्रदान करना है - लेकिन आखिरकार Django आपके द्वारा किए गए कार्यों पर कोई प्रतिबंध नहीं डालता है।

मैं इस बात से सहमत हूं कि ऐसा करने के कुछ और उदाहरण अच्छे होंगे, फॉर्मवार्ड शायद यद्यपि शुरू करने का स्थान है।

0
जोड़ा

मैंने अपनी खुद की सामान्य दृश्य कक्षाएं बनाई हैं और इसका उपयोग किया है, __ कॉल __ को परिभाषित किया है, इसलिए कक्षा का एक उदाहरण कॉल करने योग्य है। मुझे वास्तव में यह पसंद है; जबकि Django के सामान्य विचार कीवर्ड तर्कों के माध्यम से कुछ अनुकूलन की अनुमति देते हैं, ओओ जेनेरिक विचार (यदि उनके व्यवहार को कई अलग-अलग तरीकों से विभाजित किया जाता है) में सबक्लासिंग के माध्यम से बहुत अधिक बढ़िया अनुकूलन हो सकता है, जिससे मुझे खुद को बहुत कम दोहराया जा सकता है। (मैं एक ही बना / अद्यतन दृश्य तर्क को फिर से लिखने से थक गया हूं, जब भी मुझे Django के सामान्य विचारों को कुछ अनुमति नहीं देना है)।

मैंने djangosnippets.org पर कुछ कोड पोस्ट कर दिए हैं।

मैं देखता हूं कि एकमात्र असली नकारात्मक पक्ष आंतरिक विधि कॉल का प्रसार है, जो कुछ हद तक प्रदर्शन को प्रभावित कर सकता है। मुझे नहीं लगता कि यह चिंता का विषय है; यह दुर्लभ है कि एक वेब ऐप में पाइथन कोड निष्पादन आपकी प्रदर्शन बाधा होगी।

UPDATE: Django's own generic views are now class-based.

UPDATE: FWIW, I've changed my opinion on class-based views since this answer was written. After having used them extensively on a couple of projects, I feel they tend to lead to code that is satisfyingly DRY to write, but very hard to read and maintain later, because functionality is spread across so many different places, and subclasses are so dependent on every implementation detail of the superclasses and mixins. I now feel that TemplateResponse and view decorators is a better answer for decomposing view code.

0
जोड़ा
पायथन निष्पादन बाधा नहीं है, लेकिन साइट स्केलेबिलिटी और समग्र प्रदर्शन को प्रभावित कर सकता है। मैं बहुत खुश हूँ memcache मौजूद है!
जोड़ा लेखक StefanNch, स्रोत

यदि आप पृष्ठों के बीच सामान्य कार्यक्षमता साझा करना चाहते हैं तो मेरा सुझाव है कि आप कस्टम टैग देखें। वे काफी बनाने में आसान हैं, और बहुत हैं शक्तिशाली।

साथ ही, टेम्पलेट्स अन्य टेम्पलेट्स से विस्तारित हो सकते हैं । यह आपको पृष्ठ के लेआउट को सेट करने और रिक्त स्थान भरने वाले अन्य टेम्पलेट्स के बीच साझा करने के लिए आधार टेम्पलेट रखने की अनुमति देता है। आप किसी भी गहराई में टेम्पलेट घोंसला कर सकते हैं; आपको एक ही स्थान पर संबंधित पृष्ठों के अलग-अलग समूहों पर लेआउट निर्दिष्ट करने की अनुमति देता है।

0
जोड़ा
मुझे नहीं लगता कि टेम्पलेट में बहुत अधिक तर्क डालना एक अच्छा विचार है।
जोड़ा लेखक Attila O., स्रोत

जब तक कि आप कुछ जटिल जटिल नहीं करना चाहते हैं, सामान्य विचारों का उपयोग करने का तरीका है। वे उनके नाम से कहीं अधिक शक्तिशाली हैं, और यदि आप केवल मॉडल डेटा जेनेरिक विचार प्रदर्शित कर रहे हैं तो यह काम करेगा।

0
जोड़ा

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

0
जोड़ा

आप हमेशा एक वर्ग बना सकते हैं, __ कॉल __ फ़ंक्शन को ओवरराइड कर सकते हैं और फिर URL फ़ाइल को कक्षा के उदाहरण पर इंगित कर सकते हैं। आप फॉर्म विज़ार्ड पर एक नज़र डाल सकते हैं कक्षा यह देखने के लिए कि यह कैसे किया जाता है।

0
जोड़ा
मार्कअप प्रोसेसर ने आपके __ का खा लिया। मार्कअप को छुपाने के लिए \ _ का प्रयोग करें। कक्षा __call__ विधि जिसे कहा जाता है। मुद्दा यह सुनिश्चित करना है कि urls.py के पास उपलब्ध वर्ग का एक उदाहरण है। यह आपके urls.py को कुछ और जटिल बनाता है।
जोड़ा लेखक S.Lott, स्रोत

मुझे कक्षा आधारित विचारों का उपयोग करने की आवश्यकता थी, लेकिन मैं इसे अपने URLconf में कक्षा के पूर्ण नाम का उपयोग करने में सक्षम होना चाहता था, इसे हमेशा उपयोग करने से पहले दृश्य वर्ग को तुरंत चालू करने के बिना। मुझे आश्चर्य की बात है कि एक आश्चर्यजनक सरल मेटाक्लास था:

class CallableViewClass(type):
    def __call__(cls, *args, **kwargs):
        if args and isinstance(args[0], HttpRequest):
            instance = super(CallableViewClass, cls).__call__()
            return instance.__call__(*args, **kwargs)
        else:
            instance = super(CallableViewClass, cls).__call__(*args, **kwargs)
            return instance


class View(object):
    __metaclass__ = CallableViewClass

    def __call__(self, request, *args, **kwargs):
        if hasattr(self, request.method):
            handler = getattr(self, request.method)
            if hasattr(handler, '__call__'):
                return handler(request, *args, **kwargs)
        return HttpResponseBadRequest('Method Not Allowed', status=405)

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

class MyView(View):
    def __init__(self, arg=None):
        self.arg = arg
    def GET(request):
        return HttpResponse(self.arg or 'no args provided')

@login_required
class MyOtherView(View):
    def POST(request):
        pass

# And all the following work as expected.
urlpatterns = patterns(''
    url(r'^myview1$', 'myapp.views.MyView', name='myview1'),
    url(r'^myview2$', myapp.views.MyView, name='myview2'),
    url(r'^myview3$', myapp.views.MyView('foobar'), name='myview3'),
    url(r'^myotherview$', 'myapp.views.MyOtherView', name='otherview'),
)

(मैंने इसके लिए http://djangosnippets.org/snippets/2041/ पर एक स्निपेट पोस्ट किया है)

0
जोड़ा
काफी सचमुच कमाल है
जोड़ा लेखक Anentropic, स्रोत

आप Django जेनेरिक दृश्यों का उपयोग कर सकते हैं। आप आसानी से वांछित कार्यक्षमता पूरी तरह से Django जेनेरिक दृश्य प्राप्त कर सकते हैं

0
जोड़ा