django 프로젝트에 템플릿을 넣을 가장 좋은 위치는 어디입니까?


88

django 프로젝트에 템플릿을 넣을 가장 좋은 위치는 어디입니까?

답변:


50

Django 책에서 4 장 :

템플릿을 넣을 명확한 위치를 생각할 수 없다면 Django 프로젝트 내에서 템플릿 디렉토리를 만드는 것이 좋습니다 (예를 들어 본 적이 있다면 2 장에서 만든 mysite 디렉토리 내에).

이것이 바로 제가하는 일이며 저에게 큰 도움이되었습니다.

내 디렉토리 구조는 다음과 같습니다.

/media내 모든 CSS / JS / 이미지 등 의 기본 프로젝트 코드 (예 : Python 코드) 용
/templates템플릿
/projectname


1
템플릿을 / templates에 넣을 때 django.template.loaders.filesystem.Loader로로드 할 TEMPLATE_DIRS의 / template에 대한 전체 경로를 지정하지 않고 템플릿 로더에로드하도록 지시하는 방법이 있습니까? 상대 경로를 사용하여이 작업을 수행하는 것이 좋을 것입니다. 1.4 미만에서는 로더가 <project> / templates 아래를보고 있지 않습니다
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

87

놓인 <PROJECT>/<APP>/templates/<APP>/template.html앱을 다른 곳에서 재사용 할 수 있도록 도와주는 앱별 템플릿에 .

일반적인 "글로벌"템플릿의 경우 <PROJECT>/templates/template.html


11
2 <APP>초의 이유가 궁금 <PROJECT>/<APP>/templates/<APP>/template.html하십니까?
데이비드 쌰

18
첫 번째 / app / templates는 관련 앱으로 템플릿을 그룹화하는 것입니다. 두 번째 앱은 이름 충돌을 방지하는 것입니다. (아마도 TEMPLATE_DIRS가 이러한 각 디렉토리를 가리 키도록 지시 할 것이지만, 결국 Django는 이들을 하나의 거대한 디렉토리로 묶습니다.) 참조 : docs.djangoproject.com/en/dev/ref/templates/api/…
Ceasar Bautista

3
이것이 작동하려면 (django 1.6) 파일 시스템 템플릿 로더에 대한 지시문을 추가해야했습니다.TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
Fafaman

3
이 대답은 오래되었지만 어떻게 든 여기에 왔습니다. 공식적으로, TEMPLATE_DIRS지금은 사용되지 않습니다 - 대신 추가해야합니다 DIRS=[os.path.join(BASE_DIR, "templates")]TEMPLATES- 볼 stackoverflow.com/questions/29725132/...
존 아론

9

Dominic과 dlrust의 후속 조치는

우리는 django 프로젝트와 앱을 패키징하여 다양한 환경에 배포하기 위해 setuptools 소스 배포 (sdist)를 사용합니다.

템플릿과 정적 파일은 django 애플리케이션 디렉토리 아래에 있어야 setuptools로 패키지 할 수 있습니다.

예를 들어 템플릿과 정적 경로는 다음과 같습니다.

PROJECT/APP/templates/APP/template.html
PROJECT/APP/static/APP/my.js

이 작업을 수행하려면 MANIFEST.in을 수정해야합니다 ( http://docs.python.org/distutils/sourcedist.html#the-manifest-in-template 참조 ).

MANIFEST.in의 예 :

include setup.py
recursive-include PROJECT *.txt *.html *.js
recursive-include PROJECT *.css *.js *.png *.gif *.bmp *.ico *.jpg *.jpeg

또한 django 설정 파일에서 app_directories 로더가 TEMPLATE_LOADERS 에 있는지 확인해야합니다 . 기본적으로 django 1.4에 있다고 생각합니다.

django 설정 템플릿 로더의 예 :

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)

rsync 파일을 처리하는 대신 sdists를 사용하는 이유가 궁금한 경우를 대비하여; 테스트, 승인 및 프로덕션 환경에 변경되지 않은 PIP로 배포되는 단일 빌드 타르볼이있는 구성 관리 워크 플로의 일부입니다.


1
+1 추가 세부 정보와 예시 라인을 제공해 주셔서 감사합니다.
gotgenes

/static/템플릿 및 모듈 식 앱을 생각할 때 레이아웃 계획 에 포함하려면 +1 하십시오. 또 다른 모범 사례를 언급 할 수 있습니다. css파일을 static/app/csslikewise for js및 어쩌면 jpg또는 단지 /static/app/images.
hobs

7

DJANGO 1.11

기본 디렉토리 인 manage.py가있는 템플릿 폴더를 추가합니다. settings.py에서 다음과 같이 TEMPLATES의 DIRS를 변경하십시오.

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'templates')],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },
},

]

이제 코드를 사용하여 템플릿을 사용하려면,

def home(request):
    return render(request,"index.html",{})

views.py에서. 이것은 django 1.11에서 완전히 잘 작동합니다.


1

이것은 프로젝트 수준에서 더 개인적인 선택입니다. 플러그 가능해야하는 앱에 대해 이야기하는 경우 앱의 템플릿 디렉토리가 기본 위치입니다. 그러나 프로젝트 전체에서 가장 적합한 방법입니다.


1

나는 TEMPLATE_DIRS절대 경로가 필요하다는 것을 이해했습니다 . 그리고 나는 내 코드에서 절대 경로를 좋아하지 않습니다. 그래서 이것은 나를 위해 잘 작동합니다 settings.py.

import os

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(os.path.realpath(__file__)),
                 "../APPNAME/templates")
)

1
Django 프로젝트는 표준 settings.py에 이미 정의 된 기본 경로를 가지고 BASE_DIR있으므로이를 다음 과 같이 단순화 할 수 있습니다.os.path.join(BASE_DIR, '../APPNAME/templates')
ngoue

1

장고 1.10

TEMPLATE_DIRS 더 이상 사용되지 않습니다.

이제 우리는 사용에 필요 TEMPLATE, 장고 1.8에서 도입 같이 :

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... some options here ...
        },
    },
]

TEMPLATES를 정의한 후에는 ALLOWED_INCLUDE_ROOTS, TEMPLATE_CONTEXT_PROCESSORS, TEMPLATE_DEBUG, TEMPLATE_DIRS, TEMPLATE_LOADERS 및 TEMPLATE_STRING_IF_INVALID를 안전하게 제거 할 수 있습니다.

가장 좋은 위치에 대해 Django는 다음과 같은 템플릿을 찾습니다.

  • DIRS 는 엔진이 검색 순서에 따라 템플릿 소스 파일을 찾아야하는 디렉토리 목록을 정의합니다.
  • APP_DIRS 는 엔진이 설치된 애플리케이션 내에서 템플릿을 찾아야하는지 여부를 알려줍니다. 각 백엔드는 템플릿을 저장해야하는 애플리케이션 내부의 하위 디렉터리에 대한 일반적인 이름을 정의합니다.

추가 정보 : https://docs.djangoproject.com/en/1.10/topics/templates/#configuration


0

제 경우에는 이전 솔루션이 작동하지 않았습니다. 나는 다음을 사용했다 :

TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]

내 대답을보세요. TEMPLATE_DIRS현재 사용되지 않습니다.
Wilfried

Django 프로젝트는 표준 settings.py에 이미 정의 된 기본 경로가 BASE_DIR있으므로 다음 과 같이 단순화 할 수 있습니다.os.path.join(BASE_DIR, '../myapp/templates')
ngoue

0

django-dbtemplates를 사용하여 데이터베이스에 템플릿을 저장하는 것도 고려할 수 있습니다 . 또한 캐싱을위한 설정이며 템플릿의 이전 버전을 유지하는 데 도움이되는 django-reversion 애플리케이션도 있습니다.

꽤 잘 작동하지만 파일 시스템 측면에서 가져 오기 / 동기화에 대해 좀 더 유연성을 선호합니다.

[편집 : 2018 년 8 월 20 일-이 저장소는 사용할 수 없습니다. 같은 이름의 저장소는 https://github.com/jazzband/django-dbtemplates 에서 사용할 수 있으며 8 개월 전에 업데이트되었습니다. 더 이상 Django를 의미있는 방식으로 사용하지 않으므로이를 보증 할 수 없습니다.]


이것이 언제 좋은 생각일까요? DB에서 템플릿을로드하는 것이 느리지 않습니까?
jguffey

db에 템플릿을 저장하면 db에 의존하지 않고 db를 git 커밋의 일부로 만들 것입니까? 템플릿에서 다른 사용자가 변경 한 내용을 어떻게 조정 하시겠습니까?
gautamaggarwal

이것은 내가 자식을 알게되기 전에 작성된 방식입니다. 당시에 svn을 사용하고 있는지도 확실하지 않습니다. 지금 버전 관리 시스템을 사용하는 것이 좋습니다.
TonyM

@tonemcd,이 저장소는 삭제되었습니다.
lmiguelvargasf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.