2013-03-09 11 views
22

我在非Django項目中使用Django模板,我想確保我的模板不包含對不在上下文中的變量的引用,爲此我需要Django模板渲染器在上下文中沒有non_existent_variable時看到{{ non_existent_variable }}時引發錯誤。如何使Django模板如果在上下文中缺少一個變量會引發錯誤

TEMPLATE_STRING_IF_INVALID可以設置爲某種東西,然後我們可以檢查這個東西不在渲染模板中,但是這根本不是優雅的。

我可以以某種方式沒有太多的工作覆蓋方式上下文吞下丟失的關鍵錯誤?

+1

http://djangosnippets.org/snippets/646/ – catherine 2013-03-09 15:09:41

+0

我看不出一個令人信服的理由來使用Django模板引擎Django項目外。 Django模板引擎被設計爲「web-designer-proof」,這種行爲只是其中的一個折衷。你聽說過Jinja2嗎? – 2013-03-09 15:16:48

+0

謝謝@凱瑟琳!有用。 – jbasko 2013-03-09 15:17:53

回答

20

有一個Django Snippet它提供了一個解決方案:

# settings.py 
class InvalidVarException(object): 
    def __mod__(self, missing): 
     try: 
      missing_str=unicode(missing) 
     except: 
      missing_str='Failed to create string representation' 
     raise Exception('Unknown template variable %r %s' % (missing, missing_str)) 
    def __contains__(self, search): 
     if search=='%s': 
      return True 
     return False 

TEMPLATE_DEBUG=True 
TEMPLATE_STRING_IF_INVALID = InvalidVarException() 
+0

這很有用,但它不會在'{%if not i_do_not_exist%}'中找到缺少的變量。有沒有修復? – Medorator 2015-01-24 13:59:03

+2

這很好,謝謝。請注意,在Django 1.8+中,您需要設置'OPTIONS ['debug']'和'OPTIONS ['string_if_invalid']'。 但有沒有辦法讓它在'missing_var | default:「foo」'場景中工作?看起來這是在'default'有機會做這件事之前引發的。 – 2016-05-24 11:26:38

+0

我用'string_if_invalid'試過這個解決方案,運行服務器時出現這個錯誤:模板選項中的'?:(templates.E002)'string_if_invalid'必須是字符串,但是:(InvalidVarException).' – 2017-05-06 15:44:21

相關問題