Django Jinja2多级模板继承问题

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

我在Django应用程序中有以下三个文件,模板引擎是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>


在最终模板中,将打印“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>