2012-11-23 3 views
1

최근 사이트 전체의 CSS 레이아웃을 사용하는 Django 프로젝트를 작업 중이므로 각 템플릿 (이 경우에는 /projects/index.html의 템플릿)이 base.html이라는 헤더, 꼬리말, 자바 스크립트 등을 포함하는 기본 파일을 확장합니다. 당신은 내가 확장 할 기본 파일이 index.html 파일보다 높은 디렉토리에 볼 수 있듯이,django 템플릿의 절대 경로 사용

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

그리고 :

문제는 내 디렉토리 구조가 그렇게 보이는 것입니다. 일반적으로 상대 경로를 사용하고 인덱스 파일의 맨 위에 다음 코드를 사용합니다 : {% extends "../base.html" %} 또는 파일의 절대 경로를 사용하십시오 (필요한 경우)

그러나 이들 중 하나를 사용하여 메서드를 사용하면 확장에 대한 따옴표 안에있는 내용이 현재 경로에 추가되고 상위 디렉토리에 대한 호출은 완전히 무시됩니다. 현재 경로 인 경우입니다

는, 예를 들어, /project/templates/projects와 나는 물론, 존재하지 않는, /project/templates/projects/project/static/base.html를 찾기 위해 시스템을 일으키는 원인이되는 현재 경로에 추가됩니다 {% extends "/project/static/base.html" %} 사용합니다. 조사한 후에 상대 경로의 차단은 보안 목적으로 고의적이라고 말한 기사를 보았지만 현재 작업 디렉토리 외부의 파일에는 액세스 할 수 없습니다.

나는 이것이 웹 사이트를 구축 할 때 매우 일반적인 설정이라고 생각했기 때문에, 아직 알지 못하는 여러 템플릿과 상호 작용할 수있는 방법이 있어야합니다. 누구든지 그것에 관한 정보가 있다면, 그것은 많이 감사 할 것입니다.

답변

0

모두 확장 할 것이다 당신의 html 템플릿은 templates 디렉토리 (base.html 포함) 아래에 있어야합니다. 이 폴더의 위치는 settings.pyTEMPLATE_DIRECTORY 설정을 사용하여 설정합니다. static 폴더는 css, js 등을위한 폴더입니다.

extends 태그를 사용하여 다른 템플릿을 상속하면 경로는 프로젝트가 아니라 템플릿 디렉토리를 기준으로합니다.

+0

확장 기능이 템플릿 디렉토리에 상대적이라는 사실은 전혀 몰랐습니다. 하루 종일 내 인생을 힘들게했습니다. 고맙습니다. – H31IX

1

귀하의 base.htmltemplates 디렉토리에 있고 static 디렉토리에는 존재하지 않아야합니다.

settings.py 파일의 TEMPLATE_DIRS을 사용하여 django가 템플릿을 검색하는 위치를 정의했기 때문입니다. 여기에 TEMPLATE_DIRS 값을 동적으로 계산하는 예제를 제공합니다. 당신의 templates 디렉토리를 검색하는 동안 추가에

import os 

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

, 당신은, 장고가 당신의 HTML 파일/템플릿을로드하는 우선 순위를 결정 TEMPLATE_LOADERS라는 또 다른 setting에 의존한다는 것을 알고 있어야합니다. 당신의 base.html 일단

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

이 당신의 templates 디렉토리에 있습니다, 당신은 당신의 HTML 파일에서해야 할 일은 작성하는 것입니다 : -

{% extends "base.html" %} 

를하고 올바르게의

+0

고맙습니다.나는 실제로 동적 인 디렉토리 할당을하고있다. 나는 그 확장이 상대적이라는 것을 인식하지 못했다. 이 문제를 해결하기 위해 사용자 지정 템플릿 로더를 작성해야 할 수도 있다고 생각했지만 반대하는 경우가있었습니다.하지만 이렇게하는 것이 일반적 일 것 같았습니다. – H31IX