1. ホーム
  2. django

[解決済み] django テンプレートで "ブロック" を繰り返す方法

2022-06-10 07:55:37

質問

同じ {% ブロック %} を同じ django テンプレートで 2 回使いたいのです。このブロックをベーステンプレートに複数回表示させたいのです。

# base.html
<html>
    <head>
        <title>{% block title %}My Cool Website{% endblock %}</title>
    </head>
    <body>
        <h1>{% block title %}My Cool Website{% endblock %}</h1>
    </body>
</html>

そして、それを拡張する。

# blog.html
{% extends 'base.html' %}
{% block title %}My Blog{% endblock %}

# pictures.html
{% extends 'base.html' %}
{% block title %}My Pictures{% endblock %}

# cats.html
{% extends 'base.html' %}
{% block title %}My Cats{% endblock %}

Django はブロックが一度だけ表示されることを望んでいるので、例外が発生します。

で TemplateSyntaxError が発生しました。

title' という名前の 'block' タグが複数回出現しています。 複数回表示される

手っ取り早い解決策は、ブロックを複製することです。 タイトル タイトル1 タイトル2 :

# blog.html
{% extends 'base.html' %}
{% block title1 %}My Blog{% endblock %}
{% block title2 %}My Blog{% endblock %}

しかし、これは DRY の原則に反することになります。継承するテンプレートがたくさんあるので、非常に難しいですし、地獄に落ちるのも嫌なので;-)

この問題に対するトリックや回避策はありますか?すべてのコードを重複させることなく、テンプレート内で同じブロックを繰り返すにはどうしたらよいでしょうか。

どのように解決するのですか?

この場合、コンテキスト・プロセッサを使うのは行き過ぎだと思います。簡単にできるはずです。

#base.html
<html>
    <head>
        <title>{% block title %}My Cool Website{% endblock %}</title>
    </head>
    <body>
        {% block content %}{% endblock %}
    </body>
</html>

として、その後に

# blog.html
{% extends 'base.html' %}
{% block content %}
    <h1>{% block title %}My Blog{% endblock %}</h1>
    Lorem ipsum here...
{% endblock %}

などなど...。DRY互換のようです。