0

問題

django のドキュメントによると、テンプレート ローダー 'django.template.loaders.app_directories.Loader' は、INSTALLED_APPS

...そして、最初に見つかったものを使用します。

ただし、これが自己完結型アプリを持つというジャンゴの精神と一致する理由を理解するのに苦労しています。例を見てみましょう。

テンプレート サブディレクトリの django-"preferable" アプローチの使用を検討してください。

root/
-manage.py
-main/settings.py
-main/urls.py
-main/views.py
-main/templates/base.html
-main/templates/base/header.html
-main/templates/base/secondary_header.html
-main/app1/base_extension.html
-main/app1/base/secondary_header.html

当然、main/ および main/app1/ にinit .py を使用します。

標準のテンプレート ディレクトリ名を使用しているため、 TEMPLATE_LOADERSで app_directories.Loader を使用するだけです。

次の base.html と base_extension.html を検討してください。

#base.html
{% include "header.html" %}
{% block secondary_header %}{% include "base/secondary_header.html" %}{% endblock %}

#base_extension.html
{% extends "base.html" %}
{% block secondary_header %}{% include "base/secondary_header.html" %}{% endblock %}

django の精神では、base.html がレンダリングされる場合、メインの secondary_header (main/templates/base/header.html) を使用することを期待しますが、base_extension.html がレンダリングされる場合、secondary_header.html は固有のものである必要があります。 app1 からの 1 つ (main/app1/base/secondary_header.html)。これは、上記の引用テキストのために発生しません。

この問題は危険である可能性があり、 django のドキュメントでも指摘されています

INSTALLED_APPSの順序は重要です!

テンプレート名の競合がある場合、Web サイトのメイン ページのアプリの上部 (INSTALLED_APPS 内) にインストールされたアプリとして、テンプレートを「過負荷」にすることができます。

これにより、django のアプリ システムは少し「奇妙」になります。ディレクトリの階層構造により、どのテンプレートがどのアプリに属しているかをプログラマーが知っていたとしても、各アプリには他のアプリと衝突しないテンプレートが必要だからです。

質問

この問題を解決する方法はありますか? この問題は Django コミュニティで議論されましたか、それともこれを解決するローダーはありますか?

4

1 に答える 1