장고 템플릿 경로


88

Windows 7 환경 에서 http://docs.djangoproject.com/en/dev/intro/tutorial02/#intro-tutorial02 의 자습서를 따르고 있습니다. 내 설정 파일은 다음과 같습니다.

TEMPLATE_DIRS = (
    'C:/django-project/myapp/mytemplates/admin'
)

내가 가지고 base_template템플릿에서를 admin/base_site.html장고 자체의 소스 코드의 기본 장고 관리자 템플릿 디렉토리 내에서 (장고 /있는 contrib / 관리 / 템플릿) 지시 튜토리얼 등의 MyApp 디렉토리의 관리자 하위 디렉토리에.

어떤 이유로 영향을받지 않는 것 같습니다. 문제가 무엇인지에 대한 단서가 있습니까? 동기화 DB를해야합니까?

답변:


182

나는 이것이 Django 튜토리얼에 없다는 것을 알고 있으며 그들에게 부끄러운 일이지만 경로 변수에 대한 상대 경로를 설정하는 것이 좋습니다. 다음과 같이 설정할 수 있습니다.

import os.path

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))

...

MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media/')

TEMPLATE_DIRS = [
    os.path.join(PROJECT_PATH, 'templates/'),
]

이렇게하면 Django 프로젝트를 이동할 수 있으며 경로 루트가 자동으로 업데이트됩니다. 이는 프로덕션 서버를 설정할 때 유용합니다.

둘째, TEMPLATE_DIRS 경로에 의심스러운 것이 있습니다. 템플릿 디렉토리의 루트를 가리켜 야합니다. 또한 후행 /.

여기서 .../admin/디렉토리가 템플릿 루트가 아니라고 추측하겠습니다 . 그래도 절대 경로를 작성하려면 관리 템플릿 디렉토리에 대한 참조를 제거해야합니다.

TEMPLATE_DIRS = [
    'C:/django-project/myapp/mytemplates/',
]

즉, 기본적으로 템플릿 로더는 템플릿 파일을 찾기 위해 앱 디렉토리를 재귀 적으로 탐색하도록 설정되어야합니다.

TEMPLATE_LOADERS = [
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
    # 'django.template.loaders.eggs.load_template_source',
]

특별히 덮어 쓰려는 경우가 아니면 관리 템플릿을 복사 할 필요가 없습니다.

아직 실행하지 않았다면 syncdb를 실행해야합니다. 또한 runserver를 통해 django를 호스팅하는 경우 미디어 파일을 정적으로 서버해야합니다.


1
TEMPLATE_DIRS 상대 경로 끝에서 "/ admin"을 제거해 주셔서 감사합니다.
shaytac

1
이 제안은 프로젝트 폴더 안에 템플릿 디렉토리를 넣습니다. 더 나은 구성을 위해 대신 앱의 폴더에 넣는 것이 더 합리적입니까?
Sahas Katta 2012 년

2
이것은 내 문제를 해결했습니다. 감사. 그러나 기본 설정 파일에는 TEMPLATE_DIRS가 "상대 경로가 아닌 절대 경로를 사용하는 것을 잊지 마십시오"라는 주석이 있습니다. 그 댓글에 대한 정당성을 아는 사람이 있습니까?
bhekman 2013 년

1
PROJECT_PATH는 프로젝트 폴더의 절대 경로입니다. 이 메서드는 절대 미디어 경로를 런타임에 동적으로 설정하므로 값이 하드 코딩되지 않고 프로젝트 위치에 따라 자동으로 변경 될 수 있습니다. 이것은 오래된 게시물이지만 이것을 사용하여 프로젝트의 폴더 또는 파일의 위치를 ​​정의 할 수 있습니다.
digitaldreamer 2013 년

2
os.path.join기본 디렉토리에 경로를 추가 하는 데 사용 하는 것이 좋습니다 .
antonagestam

34

설치된대로 Django 설정을 사용하는 경우 기본 제공되고 사전 정의 된 BASE_DIR 및 TEMPLATES를 사용하지 않는 이유는 무엇입니까? pip 설치된 Django (v1.8)에서 다음을 얻습니다.

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


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            ### ADD YOUR DIRECTORY HERE LIKE SO:
            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',
            ],
        },
    },
]

1
이«BASE_DIR + '/ templates /',»가 트릭을 수행했습니다. 그리고 그것은 별도의 섹션보다 훨씬 더 우아하게 보입니다.
Maxiller 19-06-23

2
os.path.join(BASE_DIR, 'templates')플랫폼 독립적 인 경로에 사용 합니다.
Abhyudai

11

프로젝트 디렉토리 ( /root/templates/app_name)에 템플릿을 유지하기위한 Django 2.0.3의 스마트 솔루션 :

settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMP_DIR = os.path.join(BASE_DIR, 'templates')
...
TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [TEMP_DIR],
...

views.py에서 다음과 같은 템플릿 경로를 추가하십시오.

app_name/html_name

9

Django 1.6.6의 경우 :

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

디버그 및 프로덕션 모드 용 정적 및 미디어 :

STATIC_URL = '/static/'
MEDIA_URL = '/media/'
if DEBUG:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
else:
    STATIC_ROOT = %REAL_PATH_TO_PRODUCTION_STATIC_FOLDER%
    MEDIA_ROOT = %REAL_PATH_TO_PRODUCTION_MEDIA_FOLDER%

urls.py에 다음을 추가해야합니다.

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf.urls.static import static
from django.conf import settings

from news.views import Index

admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    ...
    )

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Django 1.8에서는 하나의 사전 ( settings.py ) 에있는 템플릿에 대한 템플릿 경로, 백엔드 및 기타 매개 변수를 설정할 수 있습니다 .

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            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',
            ],
        },
    },
]

공식 문서.


템플릿 경로는 튜플이어야합니다. 다음 TEMPLATE_DIRS 사용 = (os.path.join (BASE_DIR, 'templates'),)
renderbox

6

튜토리얼의이 부분에도 문제가있었습니다 (버전 1.7의 튜토리얼 사용).

내 실수는 '장고 관리'문자열 만 편집하고 매뉴얼에 충분히주의를 기울이지 않았다는 것입니다.

이것은 django / contrib / admin / templates / admin / base_site.html의 라인입니다 .

<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>

그러나 시간과 좌절 후에 제거해야하는 'site_header 또는 default : _'문이 있다는 것이 분명해졌습니다. 따라서 명령문을 제거한 후 (매뉴얼의 예와 같이 모든 것이 예상대로 작동했습니다).

예제 매뉴얼 :

<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>

2

좋아 😁 새 프로젝트가 있다고 가정 해 봅시다. settings.py파일 로 이동하여 TEMPLATES찾은 후 검색 하려면이 줄 os.path.join(BASE_DIR, 'template')을 붙여 넣으면 됩니다 'DIRS'. 마지막에 다음과 같은 결과를 얻을 수 있습니다.

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'template')
        ],
        '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',
            ],
        },
    },
]

BASE_DIR 디렉토리의 위치를 ​​알고 싶다면 다음 세 가지 간단한 명령을 입력하십시오.

python3 manage.py shell

셸에 들어가면 :

>>> from django.conf import settings
>>> settings.BASE_DIR

추신 : 템플릿 폴더의 이름을 다른 이름으로 지정했다면 여기서도 변경해야합니다.


2

django 3.1에서 프로젝트 설정으로 이동하여 OS 가져 오기

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',
            ],
        },
    },
]


0

기본적으로 BASE_DIRdjango 프로젝트 디렉토리, 같은 디렉토리 manage.py입니다.

    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',
                ],
            },
        },
    ]

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.