我明白你的问题:你有模板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文件:
{% block head_content %}
{% if page_title %} {{ page_title }} | {% endif %} Bhargavi Books & Stationery{% endblock head_content %}
{% block frame_content %}
Body content goes here. Body for {{ content_name }}
{% endblock frame_content %}
{% block app_content %}
APP content goes here. Body for {{ content_name }}
{% endblock app_content %}
{% block scripts %}
{% endblock scripts %}
这里是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" %}
{% block body_content %}
Body 3
{% endblock body_content %}
{% block app_content %}
DASHBOARD
{% endblock app_content %}
这里是输出,在我的浏览器中查看该页面后:
Bhargavi Books & StationeryFrame Content
DASHBOARD
由于预期*这所有的作品,我的结论是,你可能有与base.html问题模板文件。也许它没有导入你的宏,然后不能正确表现?我注意到那里有一个尾随的逗号,我不确定这可能是否有问题。我建议使用上面的代码作为出发点,然后慢慢地加回去掉的部分,也许问题会变得可见/可以理解。
*我发现奇怪的一件事,我不明白:body_content块是完全从我的输出中丢失,除非我在skeleton.html模板中定义该块。它不工作,如果我在base.html模板中定义它,这对我来说似乎是错误的,因为那么我们不是真的延伸第二个模板(base.html)...所以有确实似乎是奇怪的那里......但我无法遇到你所描述的原始问题,所以或许至少在这方面会有所帮助。