轻轻松松学Django(三):视图层

轻轻松松学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/’

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值