在上一篇文章中,我们利用实现了模板继承,到这一步,我们先对现有代码进行分析。
1. 控制台输出
启动项目后,查看控制台的输出
首先加载了setting文件,还记得我们在使用模板的时候指定了模板文件的路径:
'DIRS': [BASE_DIR+"/templates"]
我们将BASE_DIR
输出,得到:
BASE_DIR
为D:\workspace\workspaceDjango\Helloword,在加上/templates
字符串就得到我们静态文件的保存目录。至于这里为什么输出了两次,应该是因为我们使用了继承机制,每加载一次静态文件,如HTML,系统就会调用一次setting。
2. urls.py
打开urls.py文件,文件顶部有对该文件的说明(下面是我简单翻译为成中文后的注释):
"""Helloword URL Configuration
`urlpatterns` 列出视图的路由. 查看下面网址可得到更多信息:
https://docs.djangoproject.com/en/2.0/topics/http/urls/
举例:
Function views
1. 添加一个导入文件: from my_app import views
2. 添加一个url到urlpatterns: path('', views.home, name='home')
Class-based views
1. 添加一个导入文件: from other_app.views import Home
2. 添加一个url到urlpatterns: path('', Home.as_view(), name='home')
包含其他url配置
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
查看D:\Python36\Lib\site-packages\django\conf\urls__init__.py文件中的url方法:
根据我们的代码:
urlpatterns = [
url(r'^hello$', view.hello),
]
url是一个正则表达式,我们的项目在本地启动端口(默认)为8000,因此正则过后项目的访问地址为:http://127.0.0.1:8000/hello
然后指定访问的视图为view.hello,即找到view.py:
def hello(request):
context = {}
context['hello'] = 'Hello World!'
return render(request, 'hello.html', context)
代码中指定了字典context,并指定其键为’hello’的值为’Hello World!’,返回一个render,查看render方法,在…\site-packages\django\shortcuts.py中:
它返回一个内容为django.template.loader.render_to_string()
的返回值的HttpResponse。
针对我们的代码解释:
也就是说,调用了这个render方法就表示向hello.html发起请求,并将context参数带入。
现在我们就查看hello.html.
3. hello.html
{% extends "base.html" %}
{% block mainbody %}<p>继承了 base.html 文件</p>
{% endblock %}
文件首先使用{% extends “base.html” %}加载了base.html,表示base.html是该文件的父文件。base.html我们在下面分析。
该文件有一个名为mainbody 的{% block %}{% endblock %}标签,该标签是可以和继承文件或被继承文件替换。
所有的 {% block %} 标签告诉模板引擎,子模板可以重载这些部分。
因此在输出了base.html文件后就会输出<p>继承了 base.html 文件</p>
4. base.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>模板继承</title>
</head>
<body>
<h1>Hello World!</h1>
<p> Django 测试。</p>
{% block mainbody %}
<p>original</p>
{% endblock %}
</body>
</html>
该文件就是一个普通的html文件
中间的
{% block mainbody %}
<p>original</p>
{% endblock %}
就是对应子文件的mainbody
这里我们前面带过来的context参数没起到作用,修改base.html和hello.html文件。把base.html中的<h1>Hello World!</h1>
注释掉
在hello.html的block中添加<h1>{{ hello }}</h1>
:
启动项目后,页面输出:
成功将context参数输出。