Jinja2的多级模板继承问题

问题描述:

我有以下三个文件在Django应用程序,与模板引擎是Jinja2的Jinja2的多级模板继承问题

skeleton.html

<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> 

在此设置中,金贾呈现除了在最后一页的“仪表板”的一切。然而,当我在“base.html文件”添加一个空块,像这样..

{% block app_content %} 

App content Goes here... 

{% endblock app_content %} 

在最终模板,“仪表板”被打印。 Jinja有一些怪癖吗?这种行为是否在任何文档中定义?

我明白你的问题:你有模板A,模板B(扩展模板A)和模板C(扩展模板B)。在模板A中定义了一个块,但它不会显示在使用模板C的页面中,除非您在模板B中定义该块。如果这样做,则然后有问题的块出现。

第一:您的理解是正确的,这是而不是 Jinja模板层次结构应该如何工作。其次,我没有遇到你的问题(虽然发现了另一个问题),并且我已经构建了一个证明来证明这一点。这是我做了什么(同样,使用Python 3和Django的1.11):

$ python startproject myapp 

myapp/myapp/settings.py文件,我更新了模板引擎:

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,我创建了一个虚拟视图功能& route:

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), 
] 

最后,我建立了这些模板,但我删除了导入宏以及​​3210的所有实例的调用。

这里是myapp/myapp/templates/skeleton.html文件:

<!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文件:

{% extends "base.html" %} 

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

<div> 
    {% block app_content %} 
    DASHBOARD 
    {% endblock app_content %} 
</div> 

这里是输出,在我的浏览器中查看该页面后:

<!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)...所以有确实似乎是奇怪的那里......但我无法遇到你所描述的原始问题,所以或许至少在这方面会有所帮助。