2016-02-22 59 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