django TemplateSyntaxError at Invalid block tag on line x: 'tagname', expected 'endblock'.


エラー内容

django の template を編集して、画面表示を行ったところ、以下のエラーが発生しました。

TemplateSyntaxError at /
Invalid block tag on line 5: 'pagination_prev_next_for', expected 'endblock'. Did you forget to register or load this tag?

発生原因を調べましたので、調べた結果を記載します。


原因

独自のテンプレートタグとフィルタ | Django documentation | Django の記載を読んでいると、いくつか原因となる事象が記載されています。

load で、使用しているタグの記載を忘れている

メッセージの通りですが、Did you forget to register or load this tag? タグのロード記載忘れが原因です。
{% load %} の記載に対象のタグを追加することで解決しました。

INSTALLED_APPS に アプリケーションの記載がない。

以下引用です。

カスタムタグを含むアプリケーションは、{% load %} タグを機能させるために INSTALLED_APPS 内に記述される必要があります。これは、セキュリティ機能です: 毎回の Django のインストールでこれらへのアクセスを有効化することなく、単一のホストマシン上の多数のテンプレートライブラリに対して Python のコードをホストできるようにします。

register.simple_tag 関数で tag を登録していない、又は、register デコレータ を tag に付与していない。

タグは、register メソッドで登録、または、register デコレータを関数に付与しておく必要があります。

  • register メソッドで、登録する

    from django import template
    register = template.Library()
    register.simple_tag(lambda x: x - 1, name='minusone')
    

  • register デコレータを付与する

    import datetime
    from django import template
    register = template.Library()
    @register.simple_tag
    def current_time(format_string):
        return datetime.datetime.now().strftime(format_string)
    

個人的には、{% load %} への記載忘れがパターンとして一番多い気がします。
以上です。

コメント