私は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()メソッドからは逃げません。
だから:
は、どのように私は、ユーザーが編集したテンプレートのエラーを処理する便利なエラーを提供することができますか?私はこれを全く違うやり方ですべきか?
Aha!だから実際に私が見逃していた部分は: "string_if_invalidに '%s'が含まれている場合、フォーマットマーカーは無効な変数の名前に置き換えられます。 (https://docs.djangoproject.com/en/1.9/ref/templates/api/#invalid-template-variables) (しかし、strから例外への変換は素晴らしいです!) – AnotherHowie