0

テンプレートの読み込みとsettings.pyでベストプラクティスに従おうとしています。私が見たアドバイスは 1.4 よりも前の日付であるため'..'、1.4 の明らかによりネストされたプロジェクト構造を補うために、以下のコードに追加しました。

import os
DIR = os.path.abspath(os.path.dirname(__file__))

TEMPLATE_DIRS = (
    # Always use forward slashes, even on Windows.
    os.path.join(DIR, '..', 'templates').replace('\\','/'),
)

動作しているように見えますが、これは私が意図していることですか?

常にスラッシュを使用することになっているのでDIR + '/../templates'.replace('\\','/'),、の呼び出しの代わりに、私たちも同様に行うべきではありませjoin()んか?

もう 1 つの初心者の質問は、app_directoriesテンプレート ローダーのみを使用して、絶対パスを気にする必要がないのはなぜですか?

4

5 に答える 5

1

これは私がsettings.pyに持っている方法です:

#settings.py
from os.path import dirname, join, realpath
# have in mind that I have settings.py under project_root/project/settings.py
# so you probably want to check your path to your project root folder first
ROOT_DIR = realpath(join(dirname(__file__), '..'))
MEDIA_ROOT = realpath(join(ROOT_DIR, 'media'))
于 2012-11-16T16:00:13.720 に答える
0

私のやり方、

settings.py:

import os.path
static = os.path.join(os.path.dirname(__file__), 'static')
media = os.path.join(os.path.dirname(__file__), 'media')
template= os.path.join(os.path.dirname(__file__), 'template')

TEMPLATE_DIRS = (
    template,
)
# rest is the same

次に、「static」、「media」、「template」というフォルダを作成します。myproject.myproject

于 2012-11-17T03:13:02.500 に答える
0

最初の質問について:

DIR + '/../templates'.replace('\\','/') 

「/../templates」部分のバックスラッシュを置き換えるので、同じではありません。やっている

DIR.replace('\\','/') + '/../templates'

確かに同じですが、 os.path.join はよりエレガントでクリーンなアプローチです。

2 番目の質問については、テンプレートをオーバーライドしたい場合があるかもしれません。たとえば、サードパーティの django アプリケーションのみを使用していて、これらのアプリケーションの 1 つのテンプレートのみをオーバーライドしたいとします。django は TEMPLATE_LOADERS 設定 (https://docs.djangoproject.com/en/dev/ref/templates/api/#loader-types) で指定された順序でテンプレートを検索するため、次のように TEMPLATE_LOADERS を設定できます。

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

そして、あなたが言ったのとまったく同じ TEMPLATE_DIRS :

TEMPLATE_DIRS = (
    os.path.join(DIR, '..', 'mytemplates').replace('\\','/'),
)

次に、「mytemplates」ディレクトリ内にテンプレートを配置すると、同等の app_directories テンプレートが見つかる前に一致します (ファイルシステム ローダーは app_directories ローダーの前にあることに注意してください)。したがって、django はオリジナルの代わりにあなたのバージョンを使用します。

結局のところ、これは設計の問題です。カスタム アプリケーションを実装してテンプレートをオーバーライドすることもできますが、アプリケーションは特定のタスクを実行する必要があり、「テンプレート」フォルダーに無関係なテンプレートを詰め込むのは適切ではありません。

于 2012-11-17T02:27:28.033 に答える
0

プロジェクトを編成するより良い方法は、Django 1.4 のデフォルトのディレクトリ構造に従うのではなく、LINK1またはLINK2に従うことだと思います。サードパーティのアプリを含む多くのアプリがある場合、Django の構造は直感的ではありません。

リンクの構造に基づいて、テンプレートの読み込みのために次のことを行っています。

#settings.py
from os.path import abspath, dirname, join

PROJ_ROOT = dirname(abspath(__file__))
APPS_ROOT = join(PROJ_ROOT, 'apps')

sys.path.append(join(PROJ_ROOT,'apps'))

TEMPLATE_DIRS = (
    join(APPS_ROOT, 'templates'),
    join(PROJ_ROOT, 'templates'),
)

また、テンプレート名の競合を避けるために、アプリ固有のテンプレートを ../app_name/templates/app_name/ に配置すると便利です。

于 2012-11-17T09:20:44.017 に答える
0

コードが実行されるプラットフォームに関係なく、パス区切り文字としてposixpath.joingetを使用できます。/のドキュメントを参照してくださいos.path

于 2012-11-16T16:03:11.463 に答える