2016-02-22 61 views
5

我有一個Django應用程序,它使用Django模板系統生成其(非HTML)輸出,此外還有Web UI。有一組頁面供用戶爲報表創建模板,爲變量替換添加{{}}標籤,以及一個額外的模板標籤庫來很好地設置格式。Django模板引擎與錯誤檢查?

但是,我這樣做是目前的方法就是:

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

它使用默認的Web輸出模板引擎。這有string_if_invalid設置爲None,如果您更改了管理頁面,可能會在手冊中出現嚴重警告。

因此,如果用戶在一個變量名的標籤要麼得到一個錯字,它正在悄悄地忽略,使得它到輸出。如果他們有一個損壞的標籤,它實際上會殺死Web應用程序。我正在尋找一種在編輯時驗證模板的方法,以便可以警告用戶需要進行更改。

什麼我的目標是一樣的東西編譯器輸出:

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代碼,看起來像內部看起來有某種擴展異常,它有行號和導致它窒息的標記,但它不會從render()方法中轉義。

因此:

如何爲用戶編輯的模板中的錯誤提供有用的錯誤處理?我應該以完全不同的方式做這件事嗎?

回答

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': [ 
       .... 
      ], 
     }, 
    }, 
] 

順便說一句,你可以得到更多的信息如何/爲什麼這個工作在下面的文章(我寫的)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