我在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的一些怪癖吗?是否在任何文档中定义了此行为?
答案 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 }})所以确实似乎是那里奇怪的东西......但是我无法遇到你描述的原始问题,所以也许这会在特定问候上有所帮助,至少