在【Django入门】——MVC和MVT两种模式的异同中,我们知道:
views.py
文件中定义视图函数,然后在应用和项目的urls.py文件中进行相关编码;settings.py
文件中完成配置后创建模板文件。本文延续了文章【Django入门】——Django后台管理实战简介的示例。
首先,需要在views.py
文件中定义一个视图函数,该函数必须接受一个HttpRequest
类创建的对象,返回一个HttpResponse
类创建的对象。
# views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
# 1. 定义视图函数
def index(request): # request是一个HttpRequest对象
"""
这是一个视图函数,通过和Model以及Template交互用来处理浏览器发来的请求
"""
return HttpResponse('Hello Python!')
接着,需要在booktest
应用下的urls.py
文件中建立URL地址和视图函数之间的关系,具体是通过在名为urlpatterns
的列表中通过django.conf.urls
中的url()
函数创建一个对象。需要注意的是,应用下的urls.py
文件需要开发者自己手动创建。
# urls.py
from django.conf.urls import url
from booktest import views
# 2. 进行URL配置,建立URL地址和视图之间的对应关系
urlpatterns = [
# 通过url函数设置url路由配置项
url(r'^index', views.index) # 建立后续通过127.0.0.1:8000/index中的index和视图函数index之间的关系
]
然后,需要在项目test1
的urls.py
文件中包含应用booktest
中的urls
文件。
from django.conf.urls import url, include
from django.contrib import admin
# 项目的urls文件
# 3. 包含booktest应用中的urls文件
urlpatterns = [
url(r'^admin/', admin.site.urls), # 配置项目
url(r'^', include('booktest.urls')),
]
最后,使用以下命令启动服务器后,在本机浏览器地址栏输入127.0.0.1:8000/index
后将看到Hello Python Guru!字样。
python manage.py runserver
当在和启动了Django的本机机器的浏览器地址栏输入127.0.0.1:8000/index
后,服务器就会拿着/index
向Django发起请求,此时Django框架程序的执行顺序恰和上述流程相反,即:
test1
的urls.py
文件,寻找是否有被包含的应用文件;booktest
的urls.py
文件,尝试查找对应的视图函数;views.py
下定义好的视图函数然后返回结果。实际上,完整的流程如下图所示:
?
后的内容),以及前面的/
,使用剩下的pre_index
到项目的urls.py
文件进行匹配;pre_
,使用剩下的index
至应用的urls.py
文件中进行正则匹配;如下列文件结构所示,首先,需要在与booktest
应用同一级目录下创建一个用于存放模板文件的文件夹templates
,接着又在templates
下创建了一个名为booktest
的目录,这样做的原因在于:一般一个项目中可能存在多个应用,为各个应用在templates
目录下创建与应用同名的文件夹可以更好地管理与每个应用对应的模板文件,文件结构也更加清晰。
.
├────── booktest
│ ├────── admin.py
│ ├────── apps.py
│ ├────── __init__.py
│ ├────── migrations
│ │ ├────── ...
│ │ ├────── __init__.py
│ │ └────── ...
│ ├────── models.py
│ ├────── ...
│ ├────── tests.py
│ ├────── urls.py
│ └────── views.py
├────── db.sqlite3
├────── manage.py
├────── templates
│ ├────── booktest
│ └────── __init__.py
└── test1
├────── __init__.py
├────── ...
├────── settings.py
├────── urls.py
└────── wsgi.py
在新建了和模板相关的目录后,为了让Django框架在后续运行时可以找到模板文件,需要在settings.py
文件中完成如# 2
处代码所示的配置:
# settings.py
......
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
# 项目目录的绝对路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 1
......
TEMPLATES = [
{
......,
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 2.设置模板文件目录
'APP_DIRS': True,
......,
},
]
实际上,在# 2
处也可以写上templates
文件夹在当前环境下的绝对路径,但是可能产生的问题是:当项目被重新部署后,Django框架按照原先的绝对路径将找不到模板文件。
为了避免该问题,这里使用Python的os
模板:
# 1
处代码获取了当前文件在当前环境下的绝对路径;# 2
处代码得到了templates
文件夹在当前环境下的绝对路径;创建模板文件只需要在templates
下的与应用同名文件夹下创建一个HTML文件,然后在其中写入测试代码即可:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>template filestitle>
head>
<body>
<h1>This is a template fileh1>
body>
html>
为了让Django框架运行时可以使用模板文件,需要通过下列几个步骤:
from django.http import HttpResponse
from django.template import loader, RequestContext
# Create your views here.
def index(request): # request是一个HttpRequest对象
"""
这是一个视图函数,通过和Model以及Template交互用来处理浏览器发来的请求
"""
# 使用模板文件
# 1. 加载模板文件
template_obj = loader.get_template('booktest/index.html')
# 2. 定义模板上下文:为模板文件传递数据
context = {} # 向模板文件传递数据是通过字典实现的,此处还未传数据,因为为空字典
# 3. 模板文件渲染,产生标准的HTML内容
res_html = template_obj.render(context)
# 4. 返回结果给浏览器
return HttpResponse(res_html)
使用以下命令启动服务器后,在本机浏览器地址栏输入127.0.0.1:8000/index
后将看到一号标题大小的下列字样。
python manage.py runserver
This is a template file
实际上,在views.py
文件中会有多个视图函数,而每个视图函数在使用模板文件时都需要经过加载模板文件、定义模板上下文、模板文件渲染这三个步骤,因此可以考虑为此定义一个函数:
from django.http import HttpResponse
from django.template import loader
def self_render(request, template_path, context_dict=None):
"""自定义函数使用模板文件"""
# 1. 加载模板文件
template_obj = loader.get_template(template_path)
# 2. 定义模板上下文:为模板文件传递数据
if context_dict is None:
context_dict = {}
context = context_dict
# 3. 模板文件渲染,产生标准的HTML内容
res_html = template_obj.render(context)
# 4. 返回结果给浏览器
return HttpResponse(res_html)
# Create your views here.
def index(request): # request是一个HttpRequest对象
"""
这是一个视图函数,通过和Model以及Template交互用来处理浏览器发来的请求
"""
return self_render(request, 'booktest/index.html')
实际上,上述方式只是为了演示用,因为Django框架已经定义了一个用于实现上述功能的render()函数,开发者只需直接调用即可:
from django.shortcuts import render
# Create your views here.
def index(request): # request是一个HttpRequest对象
"""
这是一个视图函数,通过和Model以及Template交互用来处理浏览器发来的请求
"""
return render(request, 'booktest/index.html')
实际上,Django中的模板文件并非一定都是静态的HTML文件,这些模板文件中可能会存在一系列模板变量或代码段,从而使得模板文件可以根据传入的参数不同,达到同一个模板文件可以显示变化信息的目的。
在模板文件中:
{{var_name}}
;{%code snippet%}
格式。而模板变量和代码段中变量的实参值可通过views.py
文件中render()
函数的context
变量以字典形式传入。
以下代码演示了如何在模板文件中使用模板变量和代码段:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>template filestitle>
head>
<body>
<h1>This is a template fileh1>
1.这里演示了如何使用模板变量:<br/>
{{content}}<br/>
2.这里演示了如何使用列表:<br/>
{{list}}<br/>
3.这里演示了如何使用Django模板文件支持的遍历语法:<br/>
{%for i in list%}
<li>{{i}}li>
{%endfor%}
body>
html>
以下代码演示了如何在views.py文件中实现向模板文件的变量传递参数:
# views.py
from django.shortcuts import render
# Create your views here.
def index(request): # request是一个HttpRequest对象
"""
这是一个视图函数,通过和Model以及Template交互用来处理浏览器发来的请求
"""
return render(request=request,
template_name='booktest/index.html',
context={'content': 'Hello, Python Guru!',
'list': list(range(1, 10))
}
)
最后,在本机浏览器地址栏输入127.0.0.1:8000/index
后将看到下列信息:
This is a template file
1.这里演示了如何使用模板变量:
Hello, Python Guru!
2.这里演示了如何使用列表:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
3.这里演示了如何使用Django模板文件支持的遍历语法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
至此,本文和【Django入门】——Django中通过模型类实现数据表基本操作已经通过示例将Django框架的M(模型)、V(视图)和T(模板)三个模块做了简单的介绍。