Jinja2多级模板继承问题

时间:2017-09-13 15:23:36

标签: django python-3.x templates jinja2

我在Django App中有以下三个文件,模板引擎为Jinja2

skeleton.html

rabbitmq-plugins enable rabbitmq_management

base.html文件

root@jessie:/usr# rabbitmqadmin --help
root@jessie:/usr# 

dashboard.html

class Program
{
    static void Main(string[] args)
    {
        int amountOfNumbers;
        int counter = 0;
        int randomNumbers = 0;
        int calcRandomNumbers;

        Random generateRandNums = new Random();
        Console.WriteLine(generateRandNums.Next(5,29));

        Console.WriteLine("\nHow many numbers do you want to be entered?");
        amountOfNumbers = Convert.ToInt32(Console.ReadLine());

        while (counter < amountOfNumbers) {
            counter++;
            Console.Write(generateRandNums.Next(20) + ", ");
        }

        randomNumbers = generateRandNums.Next(20);
        calcRandomNumbers = +randomNumbers;
        Console.WriteLine("The final sum is " + calcRandomNumbers);

    }
}

在此设置中,Jinja呈现除&#34; DASHBOARD&#34;之外的所有内容。在最后一页。但是,当我在&#34; base.html&#34;中添加一个空块时,就像这样......

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

在最终模板中,&#34; DASHBOARD&#34;打印出来。这是Jinja的一些怪癖吗?是否在任何文档中定义了此行为?

1 个答案:

答案 0 :(得分:2)

我理解您的问题:您已获得模板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 中,我创建了一个虚拟视图功能&amp;路线:

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>

以下是 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模板中定义它并不起作用,这对我来说似乎不对,因为那时我们并没有真正扩展第二个模板({{1 }})所以确实似乎是那里奇怪的东西......但是我无法遇到你描述的原始问题,所以也许这会在特定问候上有所帮助,至少