2016-02-22 16 views
5

私はDjangoテンプレートシステムを使って(HTML以外の)出力とWeb UIを生成するDjangoアプリケーションを持っています。ユーザーがレポートのテンプレートを作成したり、変数置換のための{{}}タグを追加したり、テンプレートをうまく整形するための特別なtemplatetagライブラリを追加することができます。エラーチェック付きdjangoテンプレートエンジン?

しかし、私はこれをやっている現在の方法はただである:デフォルトのWeb-出力テンプレートエンジンを使用しています

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

。これにはがNoneに設定されています。また、管理ページを変更した場合は、マニュアルの致命的な警告が表示されます。

したがって、ユーザーがタグ内の変数名の入力ミスをした場合、それは静かに無視され、出力に出力されます。タグがついていれば、実際にはWebアプリを殺します。私は、編集時にテンプレートを検証する方法を探しているので、変更が必要であることをユーザーに警告することができます。

私は何を目指していますが、コンパイラの出力のようなものです:

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

は、私が最初に考えたのは(新しいテンプレートエンジンを作成)し、この1つの目的のためにそれを使用していたので、私は独特のデフォルトを見つけることができ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

Aha!だから実際に私が見逃していた部分は: "string_if_invalidに '%s'が含まれている場合、フォーマットマーカーは無効な変数の名前に置き換えられます。 (https://docs.djangoproject.com/en/1.9/ref/templates/api/#invalid-template-variables) (しかし、strから例外への変換は素晴らしいです!) – AnotherHowie

関連する問題