2017-09-13 6 views
2

나는이 Jinja2 멀티 레벨 템플릿 상속 문제

skeleton.html Jinja2

<head> 
    {% block head_content %} 
     <meta charset="utf-8"> 
     <title> {% if page_title %} {{ page_title }} | {% endif %} Bhargavi Books & Stationery </title> 
     <link rel="stylesheet" href="{{ static("css/semantic.min.css") }}"> 
     <link rel="stylesheet" href="{{ static("Icons/font-awesome.min.css") }}"> 
    {% endblock head_content %} 
</head> 

<body> 
    <div id="navigation"> 
    {% block navigation %} 
     <div class="ui three item menu"> 
      <a class="active item">Home</a> 
      <a class="item">New Bill</a> 
      <a class="item">View Bills</a> 
     </div> 
    {% endblock navigation %} 
    </div> 

    <div id="frame"> 
     {% block frame_content %} 
      <p> Body content goes here. Body for {{ content_name }}</p> 
     {% endblock frame_content %} 
    </div> 

    <div id="app"> 
     {% block app_content %} 
      <p> APP content goes here. Body for {{ content_name }}</p> 
     {% endblock app_content %} 
    </div> 

    {% block scripts %} 
     <script src="{{ static("js/jquery.js") }}"></script> 
     <script src=" {{ static("js/semantic.min.js") }} "></script> 
    {% endblock scripts %} 
</body> 

기초가되는 템플릿 엔진과 장고 응용 프로그램에서 다음과 같은 세 개의 파일, .html

{% extends "skeleton.html" %} 
{% from "macros/globalmacros.html" import 
      SUIIconList,SUISimpleList, 
      SUIImageLabel,SUILabel, 
      SUIActionInput,SUILabeledInput,SUIInput, 
      SUIDimmableActionCard,SUICard, 
%} 


{% block frame_content %} 
Frame Content 
{% endblock frame_content %} 

{% block scripts %} 

{{ super() }} 
<script src=" {{ static("js/globalmacros.js") }} "></script> 

{% endblock scripts %} 

dashboard.html

이 설정에서
{% extends "base.html" %} 

<div> 
{% block body_content %} 
Body 3 
{% endblock body_content %} 
</div> 

<div> 
{% block app_content %} 

DASHBOARD 

{% endblock app_content %} 
</div> 

은, 신사는 마지막 페이지에서 "대시 보드"를 제외한 모든 렌더링합니다. 내가 마지막 템플릿에서

{% block app_content %} 

App content Goes here... 

{% endblock app_content %} 

...과 같이, "base.html"의 빈 블록을 추가 할 때, "대시 보드"는 인쇄됩니다. 진자에서 이것 좀 이상하니? 이 동작은 모든 문서에 정의되어 있습니까 ??

답변

1

나는 템플릿 A, 템플릿 B (템플릿 A 확장), 템플릿 C (템플릿 B 확장)라는 문제를 잘 알고 있습니다. 템플릿 A에 정의 된 블록이 있지만 템플릿 B에서 해당 블록을 정의하지 않는 한 템플릿 C를 사용하는 페이지에는 표시되지 않습니다. 이렇게하면 다음 해당 블록이 표시됩니다.

첫 번째 질문은 이 아니고 Jinja 템플릿 계층 구조가 작동하는 것으로 가정합니다. 둘째로, 나는 당신의 쟁점을 발견하지 못했지만 (다른 하나를 발견했다) 나는 이것을 증명할 증거를 만들었다.

myapp/myapp/settings.py 파일에서
$ python startproject myapp 

, 내가 업데이트 템플릿 엔진 : : 여기 (파이썬 3 장고 1.11를 사용하여 다시) 무슨 짓을했는지

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.jinja2.Jinja2', 
     'DIRS': [ 
      os.path.join(BASE_DIR, 'myapp/templates') # hack/should add `myapp` to INSTALLED_APPS instead 
     ], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 

myapp/myapp/urls.py에서를, 내가 만든 더미 뷰 기능 & 경로 :

from django.conf.urls import url 
from django.shortcuts import render_to_response 

def home(request): 
    return render_to_response('dashboard.html') 

urlpatterns = [ 
    url(r'^$', home), 
] 

마지막으로 이러한 템플릿을 만들었지 만 매크로를 가져 오기위한 호출을 제거했으며 모든 인스턴스는 static()입니다.

다음
<!doctype html> 
<html lang="en"> 
<head> 
    {% block head_content %} 
    <meta charset="utf-8"> 
    <title> {% if page_title %} {{ page_title }} | {% endif %} Bhargavi Books & Stationery </title> 
    {% endblock head_content %} 
</head> 

<body> 
<div id="navigation"> 
    {% block navigation %} 
    <div class="ui three item menu"> 
     <a class="active item">Home</a> 
     <a class="item">New Bill</a> 
     <a class="item">View Bills</a> 
    </div> 
    {% endblock navigation %} 
</div> 

<div id="frame"> 
    {% block frame_content %} 
    <p> Body content goes here. Body for {{ content_name }}</p> 
    {% endblock frame_content %} 
</div> 

<div id="app"> 
    {% block app_content %} 
    <p> APP content goes here. Body for {{ content_name }}</p> 
    {% endblock app_content %} 
</div> 

{% block scripts %} 
{% endblock scripts %} 
</body> 
</html> 

myapp/myapp/base.html 파일입니다 :

{% extends "skeleton.html" %} 

{% block frame_content %} 
    Frame Content 
{% endblock frame_content %} 

{% block scripts %} 
    {{ super() }} 
{% endblock scripts %} 

그리고 여기 myapp/myapp/templates/dashboard.html 파일입니다

다음

myapp/myapp/templates/skeleton.html 파일입니다 여기

그리고내 브라우저에서 해당 페이지를 본 후, 출력입니다 : * 예상대로이 모든 일부터

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title> Bhargavi Books & Stationery </title> 
</head> 

<body> 
<div id="navigation"> 
    <div class="ui three item menu"> 
    <a class="active item">Home</a> 
    <a class="item">New Bill</a> 
    <a class="item">View Bills</a> 
    </div> 
</div> 

<div id="frame"> 
    Frame Content 
</div> 

<div id="app"> 
    DASHBOARD 
</div> 
</body> 
</html> 

, 내 결론은 당신이 base.html에 문제가있을 수 있다는 것입니다 템플릿 파일. 아마도 매크로를 가져 오지 못하고 올바르게 작동하지 않는 것입니까? 나는 거기에 후행 쉼표를 알아 차리고 문제가 될 수 있는지 여부를 확신하지 못한다. 위의 코드를 시작점으로 사용하는 것이 좋습니다. 그런 다음 천천히 다시 제거한 부분을 다시 추가하면 아마도 문제가 가시적이거나 이해할 수있게 될 것입니다.

* 내가 이해할 수없는 한 가지 : body_content 블록이 skeleton.html 템플릿에 해당 블록을 정의하지 않는 한 내 출력에서 ​​완전히 누락되었습니다. 내게 틀린 것처럼 보이기 때문에 base.html 템플릿에 정의하면 작동하지 않습니다. 두 번째 템플릿 (base.html)을 확장하는 중입니다 ... 그래서 여기 이 이상한 것처럼 보입니다. ...하지만 당신이 묘사 한 원래의 문제를 만날 수 없었습니다. 어쩌면이 점이 특히 도움이 될 것입니다. 적어도.