2012-01-24 3 views
8

を呼び出すと、varが定義されていないと、サイレントに失敗します。そのため、テンプレートをデバッグするのが難しくなります。この場合、djangoが例外をスローするように切り替える設定はありますか?djangoテンプレートを厳密にする

私が見つけた解決策の唯一のヒントはhttp://groups.google.com/group/google-appengine/browse_thread/thread/86a5b12ff868038dで、ひどくハッキリと聞こえます。

+0

指定したリンクの方法1が良好です。カスタムテンプレートタグはテンプレート機能を拡張するための正当なオプションなので、 –

答えて

4

ジャンゴ< = 1.9

設定TEMPLATE_STRING_IF_INVALID = 'DEBUG WARNING: undefined template variable [%s] not found'あなたsettings.pyインチ
https://docs.djangoproject.com/en/1.9/ref/settings/#template-string-if-invalid

ジャンゴあなたsettings.pystring_if_invalid = 'DEBUG WARNING: undefined template variable [%s] not found'テンプレートオプションを設定する> = 1.10

は、ドキュメントを参照してください。 https://docs.djangoproject.com/en/2.0/topics/templates/#module-django.template.backends.djangoも読ん

:デザインの一部だ http://docs.djangoproject.com/en/dev/ref/templates/api/#invalid-template-variables

+1

TEMPLATE_STRING_IF_INVALID = '%s''は、いくつかのランダムなテキストの代わりに定義されていない変数名を出力するので、より適切です。しかし、第2のリンクの警告ボックスを非常に慎重に読んでください。これは実際には、開発中の常時残しておかなければならない、一回限りのデバッグインスタンスのためのものではありません。 –

+2

TEMPLATE_STRING_IF_INVALIDの設定は、無効な変数をテンプレートで印刷しようとするときに役立ちますが、変数がifステートメントで使用されている場合やforループのコレクションとして使用されている場合は、ヘルプが見つかりません。これらの事件を捉える方法はありますか? – Eldamir

+1

変数が未定義の場合に例外を発生させる方法はありますか? – utapyngo

-1

は、ドキュメントを参照してください。コンテキストに変数が存在するかどうかに基づいて、デフォルトを提供し、スイッチを切り替えることができます。また、テンプレートを非常に柔軟にすることができ、厳密な "各ビューには独自のテンプレートが必要"というアプローチではなく、テンプレートの再利用性を促進します。

これまでのところ、テンプレートは実際には「デバッグ」されていません。考え方は、可能な限り多くのロジックをの外側ののテンプレートをビューまたはモデルに配置することです。コンテキストに渡すべき変数がなぜそうでないのかを知りたい場合は、デバッグする場所があなたのビューにあります。あなたのビューが戻る前にどこかでimport pdb;pdb.set_trace()をドロップしてください。

+1

コードです。ある時点でデバッグする必要があります。 – Marcin

+0

@Marcin:私はDjangoの視点で話しています。 templatetagや他の簡単な間違いを指摘することに関連しないことについて開発中のテンプレートデバッグエラーに頼っているのであれば、あなたのテンプレートには多すぎるロジックがある可能性があります。 –

+0

まあ、それは意見の問題です:)しかし、それは 'Django Opinion'であり、十分なことがあれば、別のテンプレートエンジンを使用してください!私は、他の理由のためにこういう理由でやっています。 – AdamKG

2

djangosnippetsのこのハックは、テンプレートで未定義の変数が見つかった場合に例外を発生させます。

# 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 foobar%}'や '{foobar%のfooの% '}の未定義のfoobarを検出していないようです。 – azmeuk

+0

1.9.x> 1.10.1からのアップグレード後、'?:(templates。 E002)TEMPLATESの 'string_if_invalid'は文字列である必要がありますが、(InvalidVarException)) "を持っている必要があります。 – allcaps

+0

@allcaps 'basestring'や' unicode'から継承するとどうなりますか? – utapyngo