2009-07-01 13 views
6

Django में सशर्त स्वरूपण करने का सही तरीका क्या है?डैंजो सशर्त स्वरूपण करने का तरीका

मेरे पास एक मॉडल है जिसमें एक दिनांक फ़ील्ड है, और मैं रिकॉर्ड की एक सूची प्रदर्शित करना चाहता हूं, लेकिन उस तिथि फ़ील्ड के मूल्य के आधार पर पंक्तियों को रंगना चाहता हूं। उदाहरण के लिए, आज की तारीख से मेल खाने वाले रिकॉर्ड मैं पीला होना चाहता हूं, जो रिकॉर्ड आज से पहले है, मैं लाल रंग के बाद हरे रंग के और चाहता हूं।

कहीं भी Django में आपको रिकॉर्ड की तारीख के साथ वर्तमान तिथि की तुलना करने की तुलना करने की आवश्यकता होगी।

मैं तीन अलग अलग स्थानों है कि तुलना किया जा सकता है देख सकते हैं:

  1. अपने मॉडल के लिए एक विधि जोड़ें, उदाहरण के लिए, स्थिति(), है कि या तो 'अतीत', 'वर्तमान', 'भविष्य' रिटर्न और तब पंक्तियों को रंगने के लिए टेम्पलेट में इसका उपयोग करें।
  2. टेम्पलेट में एक क्वेरीसेट लौटने की बजाय दृश्य में, सूची को पूर्व-प्रक्रिया करें और प्रत्येक रिकॉर्ड की तुलना करें, टेम्पलेट
  3. में उपयोग किए जाने वाले 'अतीत', 'वर्तमान' और 'भविष्य' मानों वाला एक नया नियम बनाएं
  4. एक नया टेम्पलेट टैग बनाएं जो तुलना करता है।

इनमें से कौन सी विधियां इसे करने का सही Django तरीका है? ऐसा लगता है कि सशर्त स्वरूपण ऐसा कुछ है जो अक्सर आ जाएगा, और चूंकि आप टेम्पलेट में मनमाने ढंग से तुलना नहीं कर सकते हैं, इसलिए कुछ अन्य समाधान की आवश्यकता है।

यह सरल स्वरूपण नियमों के लिए लागू होगा, उदाहरण के लिए, यदि मैं छात्र ग्रेड की एक सूची प्रदर्शित करना चाहता था, और मैं 80% से अधिक हरे रंग और 30% से नीचे लाल बनाना चाहता था।

उत्तर

8

मैं दृश्य समारोह में सभी "व्यवसाय" तर्क और टेम्पलेट्स/सीएसएस में सभी प्रस्तुति डालने का एक बड़ा प्रशंसक हूं।

विकल्प 1 आदर्श है। आप जोड़े की एक सूची वापस करते हैं: (दिनांक, राज्य), जहां राज्य वर्ग का नाम है ("अतीत", "वर्तमान", "भविष्य")।

आपका टेम्पलेट तब <span> के लिए कक्षा के रूप में राज्य की जानकारी का उपयोग करता है। आपका सीएसएस तब उस अवधि के लिए रंग कोडिंग प्रदान करता है।

अब आप टेम्पलेट को तोड़ने के बिना नियमों को बदलने के लिए स्वतंत्र हैं। आप एचटीएमएल या पायथन कोड को छूए बिना सीएसएस बदल सकते हैं।

{% for date,state in the_date_list %} 
    <span class="{{state}}">date</span> 
{% endfor %} 
+0

एक अच्छा समाधान, हालांकि, एक से अधिक मॉडल के साथ आपको मॉडल विधि को हर दूसरे मॉडल पर कॉपी करना होगा, जिससे आप यह करना चाहते हैं, जिससे यह मार्ग थोड़ा गीला हो जाता है। – googletorp

+0

या तो मॉडल विरासत या उपयोगिता फ़ंक्शन कोड डुप्लिकेशन को कम करेगा। –

+0

@googletorp: प्रश्न में एक से अधिक मॉडल का उल्लेख नहीं किया गया था। कक्षा के नामों को असाइन करने के लिए आवश्यक कोड की मात्रा तुच्छ है और निश्चित रूप से या तो अलग, पुन: उपयोग किया गया फ़ंक्शन या सुपरक्लास का हिस्सा हो सकता है। –

1

चूंकि आप स्थिर तुलना कर रहे हैं (कोई प्रश्न आवश्यक नहीं है), आपको सबसे अधिक DRY और लागू करने के लिए आसान विकल्प के लिए जाना चाहिए। इस मामले में, मैं विकल्प 4 के लिए जाऊंगा, टेम्पलेट फ़िल्टर बनाउंगा। फिर आप उस वर्ग को प्राप्त करने के लिए मूल्य | फ़िल्टर कर सकते हैं जिसे आपको पृष्ठभूमि रंग सेट करने की आवश्यकता होगी। टेम्पलेट फ़िल्टर वास्तव में लागू करने के लिए टेम्पलेट टैग की तुलना में थोड़ा सा सरल हैं।

3

मेरे पास एक बहुत ही समान आवश्यकता थी; के रूप में इस सुंदर व्यापार तर्क से जुड़ा हुआ है, मैं इस प्रकार की जानकारी का प्रबंधन करने के लिए एक मॉडल विधि को शामिल किया है, टेम्पलेट में तो प्रयोग की जाने वाली:

{% if not bug.within_due_date %}bgcolor="OrangeRed"{% endif %} 

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

0

आप फ़ॉर्मेटिंग और फ़िल्टरिंग टैग में निर्मित के लिए Django के संदर्भ को भी देख सकते हैं।यह सुनिश्चित है कि आप जो खोज रहे हैं और अधिक है और यह बुकमार्क करने के लिए एक अच्छा लिंक है।

आप इसे here पर देख सकते हैं।

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