덮어 쓰지 않고 {% block %}에 추가 할 수 있습니까?


116

내 core.html에는 javascript라는 블록이 있습니다. 모든 것을 덮어 쓰지 않고이 블록에 더 많은 줄을 추가 할 수 있다면 좋을 것입니다.

답변:



9

사용하여 block.super, 하나의 예를 포함 할 때뿐만 아니라 템플릿을 확장하지만 때 작품의 벌금을 :

{% extends "base.html" %} vs. {% include "partial.html" %}

페이지 중간에 템플릿을 포함하고 페이지 끝에있는 블록에 자바 스크립트를 추가하고 싶다고 가정 해 보겠습니다. 포함 된 템플릿을 호출 block.super하면 충돌이 발생합니다.

Cf. Django 문제 # 7324 , # 12008 , # 13399관련 문서 업데이트 . Cf. 태그 노트 포함 :

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

블록은 포함되기 전에 평가됩니다. 즉, 다른 블록의 블록을 포함하는 템플릿에는 확장 템플릿 등으로 재정의 할 수있는 블록이 아니라 이미 평가 및 렌더링 된 블록이 포함됩니다.

이 경우 나는 사용하는 것이 좋습니다 django-sekizai를 그러면 다음과 같은 작업을 수행 할 수 있습니다.

{% load sekizai_tags %}

                                  <p>Some content</p>
<p>Some content</p>             | {% addtoblock "js" %}
                                |   <script type="text/javascript">
{% include "partial.html" %} ->      alert("Hello django-sekizai");
                                |   </script>
<p>Some more content</p>         {% endaddtoblock %}


{% render_block "js" %}

에서 장고 - sekizai README :

이 프로젝트를 시작한 주된 이유는 django와 django-cms에 좋은 미디어 (css / js) 프레임 워크가 없기 때문입니다. 예, django의 양식에 사용되는 Media 클래스가 있지만 실제로는 잘 작동하지 않습니다. 일반적으로 프론트 엔드 직원은 CSS와 자바 스크립트 파일을 포함하기를 원하며 Python 파일을 변경하기 위해 Python 파일을 편집 할 필요가 없습니다. 따라서 현재 위치 이전 또는 이후에있는 템플릿의 내용을 편집 할 수 있어야했습니다. 또한 중복을 제거하고 싶었습니다. 결과적으로 나는 django-sekizai를 썼습니다. 블록과 유사하며 상속하는 대신 확장합니다.

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