【自学笔记/Django/2】Django中模板、视图和url的关系及模板继承
【自学笔记/Django/2】Django中模板、视图和url的关系及模板继承
备注:
1.自学Django中,打算将学习步骤记录下来,一来是个总结,二来方便以后查询。
2.本篇主要记录了完成Django的初始相关配置后,建立视图和模板以及配置路径
本篇是在上一篇【自学笔记/Django/1】Django新建与初始配置的基础上继续做的。
下面是在此之后的基本步骤:
- 建立模型models;
- 配置urls;
- 写视图views;
- 写模板html;
建立模型models
模型目前我自己基本已经设计好了,但是还没有跟view衔接上,所以暂时先不记录。等到后面写view的逻辑时再更新模型部分,不过不影响介绍urls,views,html之间的关系。
urls,views,html之间的关系
urls,views,html之间的调用关系如下图:
代码展示如下:
配置url
可以先启动服务器:python manage.py runserver ip,默认端口号是8000,所以ip可以省略,直接输入python manage.py runserver即可,用别的端口号比如8002的话就是python manage.py runserver 8002。
进入kbApp—urls.py:
from django.conf.urls import url
from . import views
urlpatterns=[
url(r'^Class/$', views.Class, name='Class'),
url(r'^Individual/$', views.Individual, name='Individual'),
]
写视图views.py
由于调用views.Class,所以切换到视图views.py里。视图是用来接收并响应web的请求的。本质就是一个python函数。
from django.shortcuts import render
from django.http import HttpResponse
from .models import ClassBaseInfo #ClassBaseInfo是model里其中一项模型类,不过目前暂时用不上,暂且先不管
# Create your views here.
def Class(request):
#这里用来写需要在web上展示的内容
return render(request, 'kbApp/Class.html', {"Title": "Class"})
写模板Class.html
这里我用到了模板的继承,所以先讲一下模板的继承。
以下面的页面为例:
可以看到First.html和Second.html的基本轮廓相似,就是中间虚线框内的部分不同,如果每写一个页面都写相应的css和js文件,无疑代码量比较大。因此我们可以先建立一个Base.html父模板,把中间虚线框的内容留出来,然后让First.html和Second.html子模板继承这个Base.html父模板,然后再各自填充虚线框里的内容。继承的代码如下:
-
父模板里预留区域:
{% block 标签名 %} {# 父模板预留区域,这里什么都不用写 #} {% endblock 标签名%}
-
子模板里填充预留的区域:
{% block 标签名 %} {# 子模板填充区域,将需要补充的写在这里 #} {% endblock 标签名 %}
【示例】
这是父模板Base.html的内容:
{% load static from staticfiles %} {#加载静态文件#}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{Title}}</title>
<link rel="stylesheet" type="text/css" href="{% static 'Base/css/Base.css' %}">
<script type="text/javascript" charset="UTF-8" src="{% static 'Base/js/Base.js' %}"></script>
{% block linkscript %}
{# 父模板预留区域1,这里什么都不用写 #}
{% endblock linkscript %}
</head>
<body>
<header></header>
<div>
{% block base %}
{# 父模板预留区域2,这里什么都不用写 #}
{% endblock base %}
</div>
</body>
</html>
子模板Class.html删除原来html内的所有内容,在开头继承一下父模板,然后填充预留的区域:
{% extends 'kbApp/Base.html' %} {# 继承Base.html的内容 #}
{% load static from staticfiles %}
{% block linkscript %}
{# 子模板填充区域1,将需要补充的写在这里,如:#}
<link rel="stylesheet" type="text/css" href="{% static 'Class/css/Class.css' %}"/>
<script type="text/javascript" charset="UTF-8" src="{% static 'Class/js/Class.js' %}"></script>
{% endblock linkscript %}
{% block base %}
{# 子模板填充区域2,将需要补充的写在这里,如: #}
<h1>This is "Class"</h1>
{% endblock base %}
如果不打算用模板继承的话,就不用管了。
在Base.html的title里设置了Class.html的title为"Class",从上面的调用关系中看下参数"Title"的传递过程:
按照urlpatterns里的路径打开浏览器,在地址栏输入http://127.0.0.1:8000/Class/,可以看到浏览器显示:
这里只展示了一个名为Class视图、模板和它的路径配置过程,并在static文件夹里建立齐css、js、image文件夹。可以根据自己的需要建立若干模板、视图和url路径,基本的调用关系就是上面的图。
下一篇: Verilog中循环语句使用