장고 템플릿 : 포함 및 확장
2 개의 다른 기본 파일에 동일한 콘텐츠를 제공하고 싶습니다.
그래서 이렇게하려고합니다.
page1.html :
{% extends "base1.html" %}
{% include "commondata.html" %}
page2.html :
{% extends "base2.html" %}
{% include "commondata.html" %}
문제는 내가 extends와 include를 모두 사용할 수 없다는 것입니다. 그렇게 할 수있는 방법이 있습니까? 그렇지 않은 경우 어떻게 위의 작업을 수행 할 수 있습니까?
commondata.html은 base1.html 및 base2.html 모두에 지정된 블록을 대체합니다.
그 목적은 형식이 약간 다른 pdf 및 html 형식으로 동일한 페이지를 제공하는 것입니다. 위의 질문은 내 문제를 해결할 것이라는 답을 얻을 수 있다면 내가하려는 작업을 단순화합니다.
extends 템플릿 태그를 사용하면 현재 템플릿이 다른 템플릿을 확장한다는 것을 의미합니다. 즉, 부모 템플릿에 종속 된 자식 템플릿입니다. Django는 자식 템플릿을보고 해당 콘텐츠를 사용하여 부모를 채 웁니다.
자식 템플릿에서 사용하려는 모든 것은 Django가 부모를 채우기 위해 사용하는 블록 내에 있어야합니다. 하위 템플릿에 include 문을 사용하려면 Django가 이해할 수 있도록 블록 안에 넣어야합니다. 그렇지 않으면 말이 안되며 Django는 그것으로 무엇을 해야할지 모릅니다.
Django 문서에는 부모 템플릿의 블록을 대체하기 위해 블록을 사용하는 몇 가지 좋은 예가 있습니다.
https://docs.djangoproject.com/en/dev/ref/templates/language/#template-inheritance
Django 문서에서 :
include 태그는 "이 서브 템플릿을 구문 분석하고 부모의 일부인 것처럼 내용을 포함"하는 것이 아니라 "이 서브 템플릿 렌더링 및 HTML 포함"의 구현으로 간주되어야합니다. 이는 포함 된 템플릿간에 공유 상태가 없음을 의미하며 각 포함은 완전히 독립적 인 렌더링 프로세스입니다.
따라서 Django는 commondata.html에서 블록을 가져 오지 않으며 블록 외부에서 렌더링 된 html로 무엇을해야하는지 알지 못합니다.
이것은 당신을 위해 트릭을 할 것입니다 : 블록 섹션 안에 include 태그를 넣으십시오.
page1.html :
{% extends "base1.html" %}
{% block foo %}
{% include "commondata.html" %}
{% endblock %}
page2.html :
{% extends "base2.html" %}
{% block bar %}
{% include "commondata.html" %}
{% endblock %}
미래의 사람들에게 도움이 될 경우를 대비하여 왜 작동하지 않았는 지에 대한 자세한 정보 :
작동하지 않는 이유는 django의 {% include %}가 멋진 아포스트로피와 같은 특수 문자를 좋아하지 않기 때문입니다. 포함시키려는 템플릿 데이터는 단어에서 붙여 넣었습니다. 이러한 특수 문자를 모두 수동으로 제거해야하며 성공적으로 포함되었습니다.
포함 된 파일의 블록을 하위 템플릿으로 가져와 상위 템플릿의 블록을 재정의 할 수 없습니다. 그러나 변수에 부모를 지정하고 컨텍스트에 기본 템플릿을 지정할 수 있습니다.
로부터 문서 :
{% extends variable %}는 변수 값을 사용합니다. 변수가 문자열로 평가되면 Django는 해당 문자열을 부모 템플릿의 이름으로 사용합니다. 변수가 Template 객체로 평가되면 Django는 해당 객체를 부모 템플릿으로 사용합니다.
별도의 "page1.html"및 "page2.html"대신 "commondata.html" {% extends base_template %}
의 맨 위에 배치 하십시오. 그런 다음보기에서 base_template
"base1.html"또는 "base2.html"로 정의하십시오.
Google을 통해이를 발견하는 미래의 사람들을 위해 추가되었습니다. 이와 같은 경우에 대해 메 자닌 라이브러리에서 제공하는 {% overextend %} 태그를 살펴볼 수 있습니다.
2015 년 12 월 10 일 편집 : 주석에서 지적했듯이 ssi 는 버전 1.8부터 더 이상 사용되지 않습니다. 문서에 따르면 :
이 태그는 더 이상 사용되지 않으며 Django 1.10에서 제거됩니다. 대신 포함 태그를 사용하십시오.
내 생각에,이 질문에 대한 정답은 podshumok의 답변입니다 . 상속과 함께 사용될 때 include의 동작을 설명하기 때문입니다.
그러나 외부 텍스트를 포함하여 인라인 용으로 특별히 설계된 Django 템플릿 시스템에서 제공 하는 ssi 태그에 대해 언급 한 사람이 아무도 없다는 사실에 다소 놀랐습니다 . 여기서 인라인 은 외부 텍스트가 해석, 구문 분석 또는 보간되지 않고 단순히 호출 템플릿 내부에서 "복사"됨을 의미합니다.
자세한 내용은 문서를 참조하세요 (페이지 오른쪽 하단의 선택기에서 적절한 Django 버전을 확인하세요).
https://docs.djangoproject.com/en/dev/ref/templates/builtins/#ssi
From the documentation:
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
Beware also of the security implications of this technique and also of the required ALLOWED_INCLUDE_ROOTS define, which must be added to your settings files.
참고URL : https://stackoverflow.com/questions/1408925/django-templates-include-and-extends
'Programing' 카테고리의 다른 글
`copy ()`로 슬라이스를 복제 할 수없는 이유는 무엇입니까? (0) | 2020.08.21 |
---|---|
디렉토리에있는 모든 파일 내용의 총 크기 (0) | 2020.08.21 |
Flask로 사용자 에이전트를 얻으려면 어떻게해야합니까? (0) | 2020.08.21 |
git diff 이름이 변경된 파일 (0) | 2020.08.21 |
UIView 하위 클래스에 대한 Nib을로드하는 올바른 방법 (0) | 2020.08.21 |