Django Jinja2多级模板继承问题
我在Django应用程序中有以下三个文件,模板引擎是Jinja2 skeleton.htmlDjango Jinja2多级模板继承问题,django,python-3.x,templates,jinja2,Django,Python 3.x,Templates,Jinja2,我在Django应用程序中有以下三个文件,模板引擎是Jinja2 skeleton.html <head> {% block head_content %} <meta charset="utf-8"> <title> {% if page_title %} {{ page_title }} | {% endif %} Bhargavi Books & Stationery </title>
<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>
在最终模板中,将打印“DASHBOARD”。这是金贾的怪癖吗?这种行为在任何文档中都有定义吗?我理解您的问题:您有模板A、模板B(扩展模板A)和模板C(扩展模板B)。模板a中定义了一个块,但它不会显示在使用模板C的页面中,除非您在模板B中定义了该块。如果您这样做,则会显示有问题的块 第一:您的理解是正确的,这不是Jinja模板层次结构应该如何工作的。第二,我没有遇到你的问题(尽管发现了一个不同的问题),我已经构建了一个证明来证明这一点。下面是我所做的(再次使用Python 3和Django 1.11): 在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/url.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()
的所有实例
以下是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>
{% extends "skeleton.html" %}
{% block frame_content %}
Frame Content
{% endblock frame_content %}
{% block scripts %}
{{ super() }}
{% endblock scripts %}
{% extends "base.html" %}
<div>
{% block body_content %}
Body 3
{% endblock body_content %}
</div>
<div>
{% block app_content %}
DASHBOARD
{% endblock app_content %}
</div>
下面是myapp/myapp/templates/dashboard.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>
{% extends "skeleton.html" %}
{% block frame_content %}
Frame Content
{% endblock frame_content %}
{% block scripts %}
{{ super() }}
{% endblock scripts %}
{% extends "base.html" %}
<div>
{% block body_content %}
Body 3
{% endblock body_content %}
</div>
<div>
{% block app_content %}
DASHBOARD
{% endblock app_content %}
</div>
{%extends“base.html”%}
{%block body_content%}
正文3
{%endblock正文\内容%}
{%block app_content%}
仪表板
{%endblock应用程序\内容%}
在我的浏览器中查看该页面后,以下是输出:
<!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>
Bhargavi书籍和文具
家
新法案
查看帐单
框架内容
仪表板
由于这一切都按预期工作*,我的结论是,base.html
模板文件可能有问题。也许是因为无法导入宏,导致行为不正确?我注意到后面有一个逗号,我不确定这是否有问题。我建议使用上面的代码作为起点,然后慢慢添加我剥离的部分,也许问题会变得可见/可以理解
*有一件事我发现很奇怪,我不明白:我的输出中完全没有body\u content
块,除非我在skeleton.html
模板中定义该块。如果我在base.html
模板中定义它,它将不起作用,这对我来说似乎是错误的,因为这样我们就不会真正扩展第二个模板(base.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>