轻轻松松学Django(三):视图层
文章目录
1. 走近视图层
视图是Django应用程序中网页的“类型”,通常具有特定功能并具有特定模板。例如,在博客应用程序中,您可能具有以下视图:
- 博客主页–显示最新的条目。
- 博客主页–显示最新的条目
- 条目“详细信息”页面–单个条目的永久链接页面。
- 基于月的存档页面–显示所有月,其中包含给定月份的条目。
- 基于日期的存档页面–显示给定日期的所有条目。
在这篇博客所制作的民意调查应用程序中,我们将具有以下四个视图:
- 问题“索引”页面–显示最新的几个问题。
- 问题“详细信息”页面–显示问题文本,没有结果,但有一个投票表。
- 问题“结果”页面–显示特定问题的结果。
- 投票行动–处理特定问题中特定选择的投票。
在Django中,网页和其他内容是通过视图传递的。每个视图均由Python函数(或方法(对于基于类的视图而言))表示。Django将通过检查所请求的URL(准确地说,是域名之后的URL部分)来选择视图。
项目创建如下:
2.编写视图层函数
现在,我们向中添加更多视图polls/views.py。这些视图略有不同,因为它们采用了一个参数:
from django.shortcuts import render, HttpResponse
# Create your views here.
def index(request):
return HttpResponse('welcome to the page polls')
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
先配置FirstDjango的urls:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('polls/', include('polls.urls')),
]
再配置polls/urls
from django.urls import path
from . import views
urlpatterns = [
# ex: /polls/
path('', views.index, name='index'),
# ex: /polls/5/
path('<int:question_id>/', views.detail, name='detail'),
# ex: /polls/5/results/
path('<int:question_id>/results/', views.results, name='results'),
# ex: /polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
]
运行该项目,在浏览器输入http://127.0.0.1:8000/polls/5/
当有人从您的网站请求页面时,例如“ / polls / 5/”,Django将加载mysite.urlsPython模块,因为该ROOT_URLCONF设置指向该模块 。它找到名为的变量urlpatterns 并按顺序遍历模式。在找到匹配项之后’polls/’,它将剥离匹配的文本(“polls/”),并将其余文本–发送 "5/"到“ polls.urls” URLconf,以进行进一步处理。在那里匹配’int:question_id/’,从而导致对detail()视图的调用,如下所示:
detail(request=<HttpRequest object>, question_id=5)
3.视图层常见的三种响应对象
3.1 HttpResponse()
3.1.1.HttpRequest.GET
一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。
3.1.2.HttpRequest.POST
一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。
POST 请求可以带有空的 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,QueryDict 对象依然会被创建。
因此,不应该使用 if request.POST 来检查使用的是否是POST 方法;应该使用 if request.method == “POST”
另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。
注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:
request.POST.getlist(“hobby”)
3.1.3.HttpRequest.body
一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。
但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。
3.1.4.HttpRequest.path
一个字符串,表示请求的路径组件(不含域名)。
例如:"/music/bands/the_beatles/"
3.1.5.HttpRequest.method
一个字符串,表示请求使用的HTTP 方法。必须使用大写。
例如:“GET”、“POST”
3.1.6.HttpRequest.get_full_path()
返回 path,如果可以将加上查询字符串。
例如:"/music/bands/the_beatles/?print=true"
3.1.7.HttpRequest.is_ajax()
如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串’XMLHttpRequest’。
大部分现代的 JavaScript 库都会发送这个头部。如果你编写自己XMLHttpRequest 调用(在浏览器端),你必须手工设置这个值来让 is_ajax() 可以工作。
如果一个响应需要根据请求是否是通过AJAX 发起的,并且你正在使用某种形式的缓存例如Django 的 cache middleware, 你应该使用 vary_on_headers(‘HTTP_X_REQUESTED_WITH’) 装饰你的视图以让响应能够正确地缓存。
3.2 render()
重写polls/views 中的index函数
def index(request):
name = "sunwukong"
pwd = "sunwukomgpwd"
dict = {'name': name, 'pwd': pwd}
return render(request, 'index.html', dict)
该render()函数将请求对象作为其第一个参数,将模板名称作为其第二个参数,并将字典作为其可选的第三个参数。它返回使用HttpResponse 给定上下文呈现的给定模板的对象。
并在templates文件中写一个index.html即模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>polls/index</title>
</head>
<body>
<h3>welcome to polls/index</h3>
<p>用户名{{ name}}</p>
<p>密码{{ pwd }}</p>
</body>
</html>
浏览器输入:http://127.0.0.1:8000/polls/返回给定模板的对象。
3.3 redirect()
用于网址的重定向,可以传入一个硬编码的URL,如’/polls/4/results/,或者可以是一个完整的URL’ http://127.0.0.1:8000/polls//4/results/’