2009-09-11 4 views
73

두 개의 서로 다른 기본 파일에 동일한 내용을 제공하고 싶습니다. django templates : include 및 extend

그래서 나는이 작업을 수행하기 위해 노력하고있어 :

page1.html :

{% extends "base1.html" %} 
{% include "commondata.html" %} 

page2.html :

{% extends "base2.html" %} 
{% include "commondata.html" %} 

문제는 내가 사용하는 것 같지 수 있다는 것입니다 둘 다 확장되고 포함됩니다. 그 일을 할 수있는 방법이 있습니까? 그리고 그렇지 않다면 어떻게해야합니까?

commondata.html는 base1.html 및 base2.html

이것의 목적은 형식이 약간 다른 PDF 및 HTML 형식으로 동일한 페이지를 제공하는 양으로 지정된 블록을 대체. 위의 질문은 비록 내가 내 문제를 해결할 수있는 대답을 얻을 수 있다면 그렇게하려고하는 것을 단순화합니다.

답변

83

확장 템플릿 태그를 사용하면 현재 템플릿이 다른 템플릿을 확장한다는 것을 알 수 있습니다. 즉, 상위 템플릿에 종속적 인 하위 템플릿입니다. Django는 하위 템플릿을보고 해당 내용을 사용하여 부모를 채 웁니다.

자식 템플릿에서 사용하고자하는 모든 것은 장고가 부모를 채우기 위해 사용하는 블록 내에 있어야합니다. 해당 자식 템플릿에 include 문을 사용하려면 장고를 이해하기 위해 블록 내에 넣어야합니다. 그렇지 않으면 그냥 이해가 안되고 장고는 어떻게 해야할지 모른다.

Django 문서에는 블록을 사용하여 부모 템플릿의 블록을 대체하는 몇 가지 좋은 예가 있습니다. 왜이 경우에 나를 위해 작동하지 않는 대한

https://docs.djangoproject.com/en/dev/ref/templates/language/#template-inheritance

+1

내 commondata.html가에 정의 된 블록을 가지고있다. 하지만 그것은 부모 tempalte의 블록을 대체하지 않습니다 ... 포함하는 대신에 page1.html과 page2.html에 정확한 데이터를 두 번 쓰면 작동합니다.그러나 저는 공통성을 commondata.html에 포함시키고 자합니다. –

+0

블록 안에서 시도 하겠지만 이전에 시도한 것 같아요. –

+0

작동하는 것처럼 보였습니다. 그러나이 작업을 시도한 것을 기억합니다. 그러나 작동하지 않는 시간에 오타가 있었음에 틀림 없습니다. –

9

더 많은 정보는 미래의 사람들을 도움 :

가 작동하지 않는 이유는 {%는 %를 포함} 장고에 '아무튼이다 공상 아포스트로피 같은 특수 문자를 좋아하지 않습니다. 내가 포함 시키려고했던 템플릿 데이터가 단어에서 붙여졌습니다. 수동으로 모든 특수 문자를 제거한 다음 성공적으로 포함시켜야했습니다. 장고 문서에서

64

:

는 태그의 구현으로 간주되어야 포함 "이 subtemplate을 렌더링하고 HTML 포함"아니이 subtemplate을 분석하고의 일부인 것처럼 그 내용을 포함하는 "등을, 부모 ". 즉, 포함 된 템플릿간에 공유 상태가 없음을 의미합니다. 각 포함은 완전히 독립적 인 렌더링 프로세스입니다.

그래서 Django는 commondata.html에서 어떤 블록도 가져 가지 않으므로 블록 외부 렌더링 된 html로 무엇을해야할지 모릅니다.

2

google을 통해 향후 사용자를 찾는 사람들을 위해 추가되었습니다. 이와 같은 경우 메 자닌 라이브러리에서 제공하는 {% overextend %} 태그를 확인하는 것이 좋습니다.

3

포함 된 파일의 블록을 하위 템플릿으로 가져 와서 상위 템플릿의 블록을 무시할 수 없습니다.그러나 변수에 상위를 지정하고 기본 템플리트를 컨텍스트에 지정할 수 있습니다. documentation 가입일

:

{% 변수 % 연장}는 변수의 값을 사용한다. 변수가 문자열로 평가되면 Django는 그 문자열을 부모 템플릿의 이름으로 사용합니다. 변수가 Template 객체로 평가되면 Django는 그 객체를 부모 템플릿으로 사용합니다.

별도의 "page1.html"및 "page2.html"대신 {% extends base_template %}을 "commondata.html"맨 위에 넣으십시오. 그런 다음 base_template을 "base1.html"또는 "base2.html"로 정의하십시오.

1

편집 2015년 12월 10일 : 코멘트에 지적한 바와 같이, SSI 버전 1.8 이후 사용되지 않습니다. 문서에 따르면 :

이 태그는 Django 1.10에서 사용되지 않으며 제거 될 예정입니다. 대신 include 태그를 사용하십시오. 이 상속와 함께 사용할 때의 동작은 다음과 같습니다 이유를 설명으로 제 생각에는


는이 질문에 대한 권리 (최고) 대답은, podshumok의 하나입니다.

그러나 I 아무도 구체적 텍스트의 외부 부분을 포함 인라인 위해 설계 장고 템플릿 시스템에 의해 제공된 SSI 태그 언급 없다고 다소 놀랐다. 여기에서 인라인은 외부 텍스트가 해석되거나 구문 분석되거나 보간되지 않지만 단순히 호출 템플릿 내에서 "복사 됨"을 의미합니다.

자세한 내용은 설명서를 참조하십시오 (페이지의 오른쪽 아래에있는 선택기에서 적절한 장고를 확인하십시오). 문서에서

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#ssi

:

ssi 
Outputs the contents of a given file into the page. 
Like a simple include tag, {% ssi %} includes the contents of another file 
– which must be specified using an absolute path – in the current page 

는 설정 파일에 추가해야하는,이 기술의 보안 관련의 또한 필요 ALLOWED_INCLUDE_ROOTS 정의 조심하십시오.

+1

1.8에서 ssi는 Include를 위해 더 이상 사용되지 않습니다. [https://docs.djangoproject.com/ko/1.8/ref/templates/builtins/#std:templatetag-include](https://docs.djangoproject.com/ko/1.8/ref/templates/builtins/# std : templatetag-include) –

5

이것은 당신을 위해 속임수를 써야합니다 : 블록 섹션 안에 include 태그를 넣으십시오.

page1.html :

{% extends "base1.html" %} 

{% block foo %} 
    {% include "commondata.html" %} 
{% endblock %} 

page2.html :

{% extends "base2.html" %} 

{% block bar %} 
    {% include "commondata.html" %} 
{% endblock %}