programing

Django 템플릿의 %} 및 "{% include %}" 확장

sourcejob 2023. 7. 23. 14:13
반응형

Django 템플릿의 %} 및 "{% include %}" 확장

저는 두 개의 다른 기본 파일 안에 같은 내용을 제공하고 싶습니다.

그래서, 저는 이것을 하려고 합니다:

1페이지.1987:

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

2페이지.1987:

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

문제는 확장과 포함을 모두 사용할 수 없는 것 같습니다.그것을 할 수 있는 방법이 있습니까?만약 그렇지 않다면, 위의 일을 어떻게 해야 합니까?

commondata.html는 둘다지정블재니다정합에 모두 합니다.base1.html그리고.base2.html

두 페이지 모두에서 동일한 페이지를 제공하는 것이 목적입니다.pdf그리고.html형식. 형식이 약간 다릅니다.하지만 위의 질문은 제가 하려는 것을 단순화시켜 줍니다. 만약 제가 답을 얻을 수 있다면 그것이 제 문제를 해결할 것입니다.

확장 템플리트 태그를 사용할 때, 현재 템플리트가 부모 템플리트에 따라 하위 템플리트라는 또 다른 템플리트를 확장한다는 것을 의미합니다.Django는 자식 템플릿을 보고 그 내용을 사용하여 부모를 채울 것입니다.

하위 템플릿에서 사용할 모든 항목은 Django가 부모를 채우는 데 사용하는 블록 내에 있어야 합니다.해당 자식 템플릿에 포함 문을 사용하려면 블록 안에 넣어야 합니다. 장고가 이해할 수 있도록 말입니다.그렇지 않으면 그것은 말이 안 되고 장고는 그것으로 무엇을 해야 할지 모릅니다.

Django 문서에는 블록을 사용하여 상위 템플릿의 블록을 대체하는 몇 가지 좋은 예가 있습니다.

https://docs.djangoproject.com/en/dev/ref/templates/language/ #허리케인스

장고 문서에서:

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

따라서 Django는 당신의 commondata.html에서 어떤 블록도 가져오지 않으며 렌더링된 html 외부 블록으로 무엇을 해야 하는지 알지 못합니다.

이렇게 하면 블록 섹션 내에 포함 태그를 삽입할 수 있습니다.

1페이지.1987:

{% extends "base1.html" %}

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

2페이지.1987:

{% extends "base2.html" %}

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

미래의 사람들에게 도움이 될 경우를 대비해 저에게 효과가 없었던 이유에 대한 자세한 정보:

작동하지 않는 이유는 장고에 {% include %}이(가) 화려한 아포스트로피 같은 특수문자를 좋아하지 않기 때문입니다.제가 포함시키려고 했던 템플릿 데이터는 단어에서 붙여넣었습니다.이 특수 문자들을 모두 수동으로 제거해야 했고 성공적으로 포함되었습니다.

포함된 파일의 블록을 하위 템플릿으로 끌어와 상위 템플릿의 블록을 재정의할 수 없습니다.그러나 변수에 부모를 지정하고 컨텍스트에 기본 템플릿을 지정할 수 있습니다.

설명서에서 다음을 참조하십시오.

extends 변수 %}은(는) 변수 값을 사용합니다.변수가 문자열로 평가되면 Django는 해당 문자열을 상위 템플릿의 이름으로 사용합니다.변수가 Template 개체로 평가되면 Django는 해당 개체를 부모 템플릿으로 사용합니다.

.html, "page1.html"과 "page2.html"을 .{% extends base_template %}"commondata."의 맨 .그리고 나서 당신의 관점에서, 정의합니다.base_template 1 2 "base 1.185" "base 2.185" "base 2.185"가 됩니다.

구글을 통해 이것을 찾는 미래의 사람들에게 참고하기 위해 추가되었습니다.이러한 경우 메자닌 라이브러리에서 제공하는 {%overextend %} 태그를 확인할 수 있습니다.

2015년 12월 10일 편집: 댓글에 지적된 처럼, ssi는 버전 1.8부터 사용되지 않습니다.설명서에 따르면:

이 태그는 더 이상 사용되지 않으며 Django 1.10에서 제거될 예정입니다.대신 포함 태그를 사용합니다.


제 생각에, 이 질문에 대한 올바른 (최선의) 대답은 포드슈목의 것입니다. 왜냐하면 그것은 상속과 함께 사용될 때의 행동이 포함되는 이유를 설명하기 때문입니다.

하지만 외부 텍스트를 포함한 인라인용으로 특별히 설계된 장고 템플릿 시스템에서 제공하는 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 정의. 설정 파일에 추가해야 합니다.

하나의 템플릿에서 {%extends%}{%include%}을(를) 모두 사용할 수 있습니다.

예를 들어, 다음과 같은 것이 있습니다.base.html아래에 표시되는Base:

# "templates/base.html"

<p>Base</p>

{% block content %}{% endblock %}

그리고, 있습니다.additional.html아래에 표시되는Additional:

# "templates/additional.html"

<p>Additional</p>

그리고, 있습니다.index.html아래에 표시되는Index:

# "templates/index.html"

<p>Index</p>

이제 확장할 수 있습니다.base.html다음을 포함additional.html{%block %}(으)<p>Index</p>index.html다음과 같이 렌더링합니다.index.htmlDjango 뷰가 있는 경우:

# "templates/index.html"

{% extends "base.html" %}

{% block content %}
    <p>Index</p>
    {% include "additional.html" %}
{% endblock %}

그리고나서,Base,Index그리고.Additional아래와 같이 표시됩니다.

Base

Index

Additional

아래 {%block %} 외부의 코드와 내부의 코드에 주의하십시오.{% block %}어떤.base.html아래 없음은 에서 무시됩니다.index.html:

# "templates/index.html"

{% extends "base.html" %}

<p>Index</p>
{% include "additional.html" %}

{% block test %}
    <p>Index</p>
    {% include "additional.html" %}
{% endblock %}

그래서, 오직Base아래와 같이 표시됩니다.

Base

언급URL : https://stackoverflow.com/questions/1408925/extends-and-include-in-django-templates

반응형