2011-03-23 3 views
5

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

लेकिन मुझे एक आम मामला मिला है जो कि कष्टप्रद है, और या तो Django के पास ऐसा करने का एक बेहतर तरीका है जिसे मैंने नहीं सोचा है, या उन्हें यहां प्रकाश देखना चाहिए और रेखा को थोड़ा सा स्थानांतरित करना चाहिए निकट भविष्य में रिलीज में एक टेम्पलेट के भीतर कंप्यूटिंग पर (जैसा कि उन्होंने उदाहरण के लिए कथन पैरामीटर के साथ किया था):

मेरे पास आइटम की क्वेरीसेट है। मुझे उन्हें किसी भी तरह प्रदर्शित करने की ज़रूरत है, लेकिन जो मैं प्रदर्शित करता हूं वह न केवल वस्तु की स्थिति पर निर्भर करता है, बल्कि अन्य स्वतंत्र चीजें (आमतौर पर जो लॉग इन है) पर निर्भर करता है। तो मॉडल में एक समारोह जोड़ने से मदद नहीं मिलेगी।

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

मुझे शायद क्वेरीसेट एनोटेशन की कोशिश करनी चाहिए, लेकिन मुझे नहीं पता कि यह कुछ और जटिल मामलों में कितना अच्छा काम करेगा। इसके अलावा, पेड़ या सूची-भीतर-सूची संरचना परिदृश्य में कोई अच्छा नहीं है (उन सदस्यों के साथ आइटम की क्वेरीसेट जो आगे पूछताछ के लिए मुझे फिर से शुरू करने की आवश्यकता है)।

मैं एक फ़िल्टर पंजीकृत कर सकता हूं, (जैसा कि यहां बताया गया है django template system, calling a function inside a model) लेकिन यह फ़िल्टर का दुरुपयोग है, है ना? वे टेक्स्ट और शायद डेटा को बदलने के लिए हैं, डेवलपर्स जानबूझकर हमें ऐसा करने की कोशिश करने के लिए एक विशिष्ट उद्देश्य प्रतिस्थापन नहीं होना चाहिए।

ऐसा करने के लिए कोई भी "उचित" तरीका है जिसे मैं नहीं जानता? क्या मैं यहां सुझाव दे रहा हूं कि यह डीजेगो के टेम्पलेटिंग सिस्टम की कमी है क्योंकि यह खड़ा है?

उत्तर

2

शायद Jinja templates इस उदाहरण में डीजेगो के टेम्पलेटिंग सिस्टम का उपयोग करने का एक अच्छा विकल्प होगा। महत्वपूर्ण तथ्य के अलावा कि जिनजा आपको अपने टेम्पलेट्स में कुछ स्तर के तर्क का उपयोग करने की अनुमति देता है, जिनजा टेम्पलेट्स और डीजेगो टेम्पलेट्स लगभग समान हैं।

यह उदाहरण कोड जिन्जा दस्तावेज़ों से सीधे लिया गया यह प्रतीत होता है कि यह ऐसी चीज हो सकती है जिसे आप प्राप्त करने की कोशिश कर रहे हैं।

{% for comment in models.comments.latest(10) %} 
    ... 
{% endfor %} 

Django के साथ जिंजा एकीकृत करने के लिए, आप Coffin

4

पर दिखाई दे सकता है मैं क्यों एक कस्टम टैग बनाने या फिल्टर एक 'दुरुपयोग' है नहीं दिख रहा। जहां तक ​​मेरा संबंध है, वही है जो वे हैं, और मैं उन्हें हर समय उपयोग करता हूं।

+0

+1 मैं सहमत हूं। मैंने अभी एक साइड-प्रोजेक्ट के लिए डीजेगो टेम्पलेट्स का उपयोग करना शुरू कर दिया है (मैं अपने मुख्य प्रोजेक्ट के लिए माको का उपयोग करता हूं), और जब मुझे कुछ मामलों में यह बोझिल लगता है, तो टैग दर्ज करना वास्तव में मुश्किल नहीं है। आप तर्क को 'कोड' क्षेत्र में ले जा रहे हैं, और इसे प्रदर्शन तर्क से हटा रहे हैं। –

+0

लेकिन उस बिंदु पर, वे आपको किसी भी सदस्य फ़ंक्शन में पैरामीटर क्यों नहीं देते हैं? क्या वे इसे बहुत अधिक करने से रोकने के लिए इसे और अधिक बोझिल बनाते हैं? – orblivion

+1

मैं इसे दुर्व्यवहार नहीं कहूंगा लेकिन मैं इस पर @orblivion से सहमत हूं।एक कस्टम टैग या फ़िल्टर बनाना इस समस्या का अनुशंसित उत्तर हो सकता है लेकिन अधिकांश समय यह केवल अवांछित संकेत प्रदान करता है। आपके टेम्पलेट में अभी भी एक विधि कॉल है और यह अभी भी एक पैरामीटर पास करता है। केवल अंतर यह है कि आपको एक बिचौलियों को लिखने के लिए मजबूर होना पड़ता है। – poswald

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

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