2011-08-22 13 views
6

क्या Django टेम्पलेट में isinstance/issubclass करने का कोई तरीका है? मुझे एहसास है कि मैं अपना खुद का templatetag लिख सकता हूं, लेकिन मुझे आश्चर्य है कि यह संभवतः ऐसा नहीं है जो मुझे लगता है कि मैं या तो कुछ गलत कर रहा हूं या कुछ स्पष्ट याद कर रहा हूं।Django टेम्पलेट में IsInstance?

मैं मार्कअप के दो अलग-अलग सेगमेंट प्रदर्शित करना चाहता हूं, इस बात के आधार पर कि मैं किस प्रकार की वस्तु को प्रदर्शित कर रहा हूं, जबकि मैं अपने संग्रह पर पुनरावृत्ति करता हूं। धन्यवाद!

उत्तर

5

यदि इनमें से सभी एक सामान्य आधार प्रकार से प्राप्त होते हैं, लेकिन आपको यह जानने की आवश्यकता है कि यह किस प्रकार का है, तो आप उस आधार पर एक विधि को लागू करना चाहेंगे जो प्रकार लौटाता है - फिर आप if foo.get_type == 'type1' (या जो भी) पर कॉल कर सकते हैं अपने टेम्पलेट में

0

आप यहां कुछ खो रहे हैं: टेम्पलेट में एकमात्र तर्क टेम्पलेट प्रतिपादन को संभालने वाला माना जाता है। isinstance/issubclass स्पष्ट रूप से दृश्य तर्क की तरह गंध करता है, और दृश्य में होना चाहिए। टेम्पलेट प्रतिपादन उन कार्यों पर निर्भर करता है (जो मुझे लगता है कि यह करता है), तो आपको ध्यान में रखते हुए तर्क को लागू करना चाहिए, और बस क्या यह पता करने की जरूरत है टेम्पलेट पारित:

# in the view: 
if isinstance(some_obj, SomeClass): 
    do_fancy_template_stuff = True 
else: 
    do_fancy_template_stuff = False 

# in the template: 
{% if do_fancy_template_stuff %} 
    <fancy_template_stuff /> 
{% endif %} 

याद रखें: Django templating इंजन था डिजाइनरों की तरह, दिमाग में गैर प्रोग्रामर होने के कारण बनाया गया।

+4

हममम, मैं सामान्य रूप में भावना से सहमत है संपादित, लेकिन मुझे यकीन नहीं है कि मैं इसे दूर तक ले जा रहा हूं। मेरा उपयोग मामला है, मेरे पास सामानों का संग्रह है, सभी सामान्य आधार प्रकार हैं, लेकिन संग्रह के भीतर मिश्रित हैं। एक फू इस तरह प्रदर्शित होना चाहिए, एक बार उस तरह प्रदर्शित होना चाहिए, समान रूप से, लेकिन थोड़ा अलग। उनके पास प्रदर्शित करने के लिए थोड़ा अलग फ़ील्ड हैं, इसलिए अलग-अलग डिस्प्ले टुकड़े हैं, इसलिए यह {% if item.field_that_bars_have%} या इसी तरह के कहने के लिए मोहक है, लेकिन यह बुरा लगता है। – Ludo

+0

मुझे लगता है कि इसे संभालने का सही तरीका एक कस्टम टैग, render_result_item, या कुछ ऐसा है जो सही प्रदर्शन खंड चुन सकता है। इस तरह तर्क तर्क टेम्पलेट से बाहर रहता है, हालांकि इसे कहीं भी डालने की कीमत पर हमारे गैर-प्रोग्रामर/डिजाइनर इसे नहीं ढूंढ पाएंगे। या मैं एक इंस्टेंसेंस टेम्पलेटैटग लिख सकता हूं। या मैं मॉडल में get_type या कुछ जोड़ सकता हूं। मैं अब रैंपिंग कर रहा हूं - आपकी प्रतिक्रिया के लिए धन्यवाद :)। – Ludo

8

मुझे लगता है कि यहां एक साधारण टेम्पलेट फ़िल्टर सबसे अच्छा फिट बैठता है। यह वास्तव में लागू करने और कॉल करने में आसान है। कुछ इस तरह:

templatetags में /my_filters.py:

from django import template 
from django.utils.importlib import import_module 

register = template.Library() 

@register.filter 
def isinst(value, class_str): 
    split = class_str.split('.') 
    return isinstance(value, getattr(import_module('.'.join(split[:-1])), split[-1])) 

अपने खाके में :

{% load my_filters %} 

... 

{% if myvar|isinst:"mymodule.MyClass" %} 
...do your stuff 
{% endif %} 

हालांकि उपरोक्त एक नमूना कोड (परीक्षण नहीं) है, मैं विश्वास करो कि यह काम करना चाहिए। के लिए कस्टम टेम्पलेट फिल्टर बारे में अधिक जानकारी कृपया देखें the django documentation

संपादित करें: जवाब पता चलता है कि फिल्टर तर्क वास्तव में एक स्ट्रिंग और नहीं एक अजगर वर्ग

+0

किसी मॉडल के पूर्ण पथ को संदर्भित करने के लिए यह समाधान बैकएंड में रेफैक्टरिंग के लिए नाजुक बनाता है, इसके अलावा इसे इन पथों को जानने के लिए टेम्पलेट/एचटीएमएल डिजाइनर की आवश्यकता होती है। यदि आपकी टीम बैकएंड प्रोग्रामर और टेम्पलेट डिज़ाइनर में विभाजित है तो ऐसा करने का सबसे अच्छा तरीका नहीं है। –

+0

मैं पूरी तरह से सहमत हूं।यहां सवाल का जवाब देना है; यह आपके टेम्पलेट्स में सशर्त सामान करने के लिए सबसे अच्छा अभ्यास नहीं है। – ppetrid

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