2016-02-22 12 views
5

मेरे पास एक Django एप्लिकेशन है जो वेब यूआई के अतिरिक्त, इसके (गैर-एचटीएमएल) आउटपुट उत्पन्न करने के लिए Django टेम्पलेट सिस्टम का उपयोग करता है। ऐसे पृष्ठों का एक सेट है जहां कोई उपयोगकर्ता रिपोर्ट के लिए टेम्पलेट बना सकता है, {{}} परिवर्तनीय प्रतिस्थापन के लिए टैग जोड़ना, और एक अच्छी टेम्पलेटेटाग लाइब्रेरी को अच्छी तरह से प्रारूपित करने के लिए।django टेम्पलेट इंजन?

हालांकि, मौजूदा तरह से मैं यह कर रहा हूँ बस है:

t = Template(component_template) 
self.output_content = t.render(component_context) 

कौन सा डिफ़ॉल्ट वेब उत्पादन टेम्पलेट इंजन का उपयोग करता। इसमें string_if_invalidNone पर सेट है, और यदि आप इसे बदलते हैं तो व्यवस्थापक पृष्ठों को तोड़ने के बारे में मैन्युअल में सख्त चेतावनियां हैं।

तो यदि कोई उपयोगकर्ता टैग में एक चर नाम में टाइपो प्राप्त करता है, तो इसे चुपचाप अनदेखा कर दिया जाता है और इसे आउटपुट में बनाता है। अगर उनके पास एक उलझन वाला टैग है, तो यह वास्तव में वेब ऐप को मार देता है। मैं संपादन समय पर टेम्पलेट को सत्यापित करने का एक तरीका ढूंढ रहा हूं, ताकि उपयोगकर्ता को चेतावनी दी जा सके कि परिवर्तन की आवश्यकता है।

क्या मैं के लिए लक्ष्य कर रहा हूँ संकलक उत्पादन की तरह कुछ है:

unknown variable 'ffsdfd' on line 33 of template 
template syntax error on line 22 of template 

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

engine = Engine(string_if_invalid="!!MISSING_VARIABLE!!", dirs=settings.TEMPLATES[0]['DIRS'], 
       context_processors=settings.TEMPLATES[0]['OPTIONS']['context_processors'], 
       app_dirs=settings.TEMPLATES[0]['APP_DIRS']) 

t = Template(component_template, engine=engine) 

try: 
    self.output_content = t.render(component_context) 
except TemplateSyntaxError: 
    pass # do something useful here to collect error messages 

TemplateSyntaxError अपवाद, काम करता है को छोड़कर मैं किसी भी संदर्भ जानकारी है, जहां त्रुटि वास्तव में है, और निश्चित रूप से मैं केवल प्रथम विफलता मिल की तरह नहीं मिलता है। Django.template कोड में देखकर, ऐसा लगता है कि आंतरिक रूप से कुछ प्रकार का विस्तारित अपवाद है जिसमें रेखा संख्या और टोकन है जो इसे दबाता है, लेकिन यह रेंडर() विधि से बच नहीं जाता है।

तो:

मैं कैसे उपयोगकर्ता के संपादित टेम्पलेट्स में त्रुटियों के लिए से निपटने उपयोगी त्रुटि प्रदान कर सकते हैं? क्या मैं इसे एक अलग तरीके से पूरी तरह से कर रहा हूं?

उत्तर

4

यहां एक कस्टम क्लास और string_if_invalid का उपयोग करके मैं इसे स्वयं हल करता हूं। यह आपको परिवर्तनीय नाम प्राप्त करता है, लेकिन मुझे यकीन है कि आप अतिरिक्त संदर्भ जानकारी प्राप्त करने के लिए इसे आगे बढ़ा सकते हैं।

वैश्विक settings.py उदाहरण के लिए, आसानी से अपने इनलाइन उदाहरण के लिए अनुकूल होना चाहिए:

class InvalidTemplateVariable(str): 
    def __mod__(self,other): 
     from django.template.base import TemplateSyntaxError 
     raise TemplateSyntaxError("Invalid variable : '%s'" % other) 

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [....], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'string_if_invalid': InvalidTemplateVariable("%s"), 
      'context_processors': [ 
       .... 
      ], 
     }, 
    }, 
] 

BTW, आप पर अतिरिक्त जानकारी प्राप्त कर सकते हैं कि कैसे/क्यों यह निम्न आलेख पर काम करता है (जो मैंने लिखा) http://www.webforefront.com/django/customizedjangotemplates.html#stringifinvaliderror

+0

आह! तो वास्तव में जो हिस्सा मैं खो रहा था वह था: "यदि string_if_invalid में '% s' है, तो प्रारूप मार्कर को अमान्य चर के नाम से बदल दिया जाएगा।" (https://docs.djangoproject.com/en/1.9/ref/templates/api/#invalid-template-variables) (लेकिन स्ट्र से अपवाद का रूपांतरण अच्छा है!) – AnotherHowie

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