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