3

最近、サイト全体の CSS レイアウトを使用する Django のプロジェクトに取り組んでいるので、使用する各テンプレート (この場合は /projects/index.html 内のテンプレート) は、ヘッダーを含むベース ファイルを拡張することにしました。フッター、javascript などと呼ばれbase.htmlます。

問題は、私のディレクトリ構造が次のようになっていることです。

.
├── static
│   └── base.html
├── templates
│   └── projects
│   └── index.html

そして、ご覧のとおり、拡張したい基本ファイルは index.html ファイルよりも上位のディレクトリにあります。通常、私は相対パスを使用し、インデックス ファイルの先頭で次のコードを使用します:{% extends "../base.html" %}または、単にファイルへの絶対パスを使用します (必要な場合)。

ただし、これらの方法のいずれかを使用すると、 extends の引用符内にあるものはすべて現在のパスに追加され、 .. を使用した上位ディレクトリへの呼び出しは完全に無視されるようです。

つまり、たとえば、現在のパスが で/project/templates/projectsあり、私が を使用している場合{% extends "/project/static/base.html" %}、それが現在のパスに追加され、システムが を探しますが/project/templates/projects/project/static/base.html、もちろん存在しません。調査の結果、相対パスのブロックはセキュリティ上の目的で意図的に行われているという記事に出くわしましたが、現在の作業ディレクトリ以外のファイルにアクセスする方法がありません。

これは、Web サイトを構築するときの非常に一般的な設定でなければならないと考えたので、まだ気付いていない複数のテンプレートと対話する何らかの方法が必要であると考えました。誰かがそれについての情報を持っているなら、それは大歓迎です。

4

2 に答える 2

2

ディレクトリではなく、ディレクトリbase.htmlに存在する必要があります。templatesstatic

これは、ファイル内で を使用して、django がテンプレートを検索する場所を定義しているためTEMPLATE_DIRSですsettings.pyTEMPLATE_DIRSここでは、値を動的に計算する例を示します。

import os

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), '..', 'templates'),
)

さらに、ディレクトリを検索する際に、django が html ファイル/テンプレートをロードする優先順位を決定するために、別のsetting呼び出しに依存していることに注意する必要があります。TEMPLATE_LOADERStemplates

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
    # 'django.template.loaders.eggs.Loader',
)

base.htmlディレクトリに配置したら、templateshtml ファイルで行う必要があるのは、次のように記述することだけです。

{% extends "base.html" %}

そして、あなたは正しく拡張します

于 2012-11-23T01:37:22.907 に答える
1

すべての html テンプレートは、templatesディレクトリの下にある必要があります (base.html を含む)。このフォルダの場所は、 の設定を使用してTEMPLATE_DIRECTORY設定されますsettings.py。このstaticフォルダーは、css、js など専用です。

タグを使用して別のテンプレートから継承する場合extends、指定するパスは、プロジェクトではなく、常にテンプレート ディレクトリからの相対パスになります。

于 2012-11-23T01:37:31.560 に答える