视图 (View) 是 Django 的 MTV 架构模式的 V 部分, 主要负责 处理用户请求和生成相应的响应内容, 然后在页面或其他类型文档中显示。 也可以理解为视图是 MVC 架构里面的 C 部分 〈控制器) , 主要处理功能和业务上的逻辑。
使用模板实现下载功能:
在 index 的 urls.py 和 views-py 中分别添加以下代码:
# 在urls.py中
path(r'download.html', views.download)
# 在views.py中
def download(request):
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename = "somefilename.csv"'
writer = csv.writer(response)
writer.writerow(['First row', 'A', 'B', 'C'])
return response
- 当接收到用户的请求后,视图函数 download 首先定义 HtφResponse 的响应类 型为文件 (text/csv) 类型,生成 response 对象。
- 然后在 response 对象上定义 Content-Disposition,设置浏览器下载文件的名称。 a忧achment 设置文件的下载方式,自lename 为文件名 。
- 最后使用 CSV 模块加载 response 对 象,把数据写入 response 对象所设置的csv 文件并将 response 对象返回到浏览器上,从而实现文件下载。
django.http 除了实现文件下载之外, 要使用该模块生成精美的 HTML 网页,可以 在响应内容中编写 HTML 源码,如 HttpResponse(, <html><body>... </b0 dy></html>。尽管这是一种可行的方法,但并不符合实际开发。因此, Djang。 在 司jango.htφ 模块上 进行封装,从而有了 render()、 render_to_response() 和 redirect() 函数。
render() 和 render_to_response() 实现的功能是一致的。 render_ to _response() 自 2.0 版本以来已开始被弃用,并不代表在 2.0 版本无法使用,只是大部分开发者都使用 render()。
render 语法:
render (request, template_name, context = None, content_type = None, status = None, using = None)
- request: 浏览器向服务器发送的请求对象,包含用户信息、请求内容和请求方式等。
- template_name: HTML 模板文件名,用于生成 HTML 网页 。
- context: 对 Html 模板的变量赋值,以字典格式表示, 默认情况下是一个空字典。
- content_type: 响应数据的数据格式,一般情况下使用默认值即可。
- status: HTTP 状态码,默认为 200。
- using: 设置 Html 模板转换生成 Html 网页的模板引擎。
除了 render 函数外,还有 redirect() 函数。 redirect() 函数用于实现请求重定向, 重定向的链接以字符串的形式表示,链接的地址信息可以支持相对路径和绝对路径。
# urls.py 的 URL 地址信息
path('login.html',views.login)
# views.py 的视图函数
def login(request) :
#相对路径, 代表首页地址
return redirect('/')
#绝对路径, 完整的地址信息
# return redirect('http://127.0.0.1:8000/')
数据可视化(将数据库中的数据显示到模板中)
视图除了接收用户请求和返回响应内容之外, 还可以与模型 (Model) 实现数据 交互(操作数据库)。视图相当于一个处理中心,负责接收用户请求, 然后根据请求 信息读取并处理后台数据,最后生成 HTML 网页返回给用户 。
视图操作数据库实质是从 models.py 导入数据库映射对象, models.py 的数据库对 象是通过 Django 内置的 ORM 框架构建数据库映射的,从而生成数据库对象。
使用数据模型生成迁移文件并且创建数据库中的表。
生成迁移文件:
#根据 models .py 生成相关的 .py 文件,该文件用于创建数据表
E : \MyDjango>python manage.py makemigrations
Migrations for 'index':
index \migrations\OOOl_initial. py
- Create model product
执行迁移文件:
E : \MyDjango>python manage .py migrate
在模板中添加下面代码, 主要将视图 的变量传递给模板,通过模板 引擎转换成 HTML 语言。
<ul id="cate_box" class="lf">
{% for type in type_list %}
<li>
<h3><a href="#">{{ type.type }}</a></h3>
<p>
{% for name in name_list %}
{% if name.type == type.type %}
<span>{{ name.name }}</span>
{% endif %}
{% endfor %}
</p>
</li>
{% endfor %}
</ul>
在视图中增加下面代码从数据库中抽取数据返回到模板中:
def index(request):
type_list = Product.objects.values('type').distinct()
name_list = Product.objects.values('name','type')
context = {'title': '首页', 'type_list': type_list, 'name_list': name_list}
return render(request, 'index.html',context=context, status=200)
对上述代码的解释:
- type_list 用于查询数据表字段 type 的数据并将数据去重, name list 用于查询数 据表字段 type 和 name 的全部数据, 这两种独特的查询方式都是由 Django 内置的 ORM 框架提供的。
- 将查询所得的数据以字典的数据格式写入变量 context 中 , 变量 context 是rende() 函数的参数值,其作用是将变量传递给 HTML 模板。
- 当 HTML 模板接收到变量 type_list 和 name list 后,模板引擎解析模板语法并生成 HTML 文件。
想要将数据库的数据展现在网页上, 需要由视图 、模型和模板共同实现, 实现步骤如下:
- 定义数据模型, 以类的方式定义数据表的字段。 在数据库创建数据表时, 数据表由模型定义的类生成。
- 在视图导入模型所定义的类, 该类也称为数据表对象, Django 为数据表对象提供独有的数据操作方法, 可以实现数据库操作, 从而获取数据表的数据。
- 视图函数获取数据后, 将数据以字典、列表或对象的方式传递给 HTML 模板, 并 由模板引擎接收和解析, 最后生成相应的 HTML 网页。
在上述视图函数中,交量 context 是以 字典的 形式传递给 HTML 模板的 。 在实际开发过程中,如果传递的交量过多,使用变量 context 时就显得非常冗余,而且不利于日后的维护和更新。 因此,使用 locals() 取代变量 context。
locals() 的使用方法:在视图函数中所定义的变量名一定要与 HTML 模板的变量名相同才能生效,如视 图 函数的 type_list 与 HTML 模板的 type_list,两者的交量名 一致才能将视图函数的 变 量传递给 HTML 模板。
获取请求信息:
请求信息属性 | 说明 | 实例 |
cookies | 客户端浏览器的Cookie信息 | data = request.COOKIES |
FILES | 字典对象,包含所有的上传文件。该字典有三个键:filename 为上传文件的文件名;content-type 为上传文件的类型;content 为上传文件的原始内容。 | file = request.FILES |
GET | 获取GET请求的请求参数,以字典形式存储 | // {'name': 'TOM'} request.GET.get('name') |
META | 获取客户端的请求头信息,以字典形式存储 | // 获取客户端的IP地址 request.META.get('REMOTE_ADDR') |
POST | 获取POST请求的请求参数,以字典形式存储 | // 如 {'name': 'TOM'} request.POST.get('name') |
method | 获取当前请求的请求方式(GET或POST) | data = request。method |
path | 获取当前请求的URL地址 | path = request.path |
user | 获取当前请求的用户信息 | // 获取用户名 name = request.user.username |
一般情况下,用户打开浏览器 访问某个 URL 地址都是 GET 请求:而在网页上输入信息并点击某个按钮时, 以 POST 请求居多,如用户登录、注册等。
GET:
在浏览器上分别输入以下 URL 地址:
http://127.0.0.1:8000/1ogin.html?name=Torn
通用视图:
Django 植入了通用视图这一功能,该功能封装了视图开发常用 的代码和模式,可以在无须编写大量代码的情况下,快速完成数据视图的开发。
- TemplateView:TemplateView 直接返回 HTML 模板,但无法将数据库的数据展示出来。
- ListView :ListView 能将数据库的数据传递给 HTML 模板,通常获取某个表的所有数据。
- DetailView :DetailView 能将数据库的数据传递给 HTML 模板,通常获取数据表的单条数据。
在 urls.py 中添加 URL 地址信息,代码如下:
# views.py 代码
from django.urls import path
from . import views
urlpatterns = [
#通用视图 ListView
path('index/' , views.ProductList.as_view())
]
如果 URL 所指 向 的处理程序是 由通用视图执行的,那么在编写 URL 时, URL 所指向的处理程序应当是一个通用视图, 并且该通用视图上必须使用 as_view() 方法。