目录
简单的视图
返回当前日期和时间作为HTML文档的视图
from django.http import HttpResponse
import datetime
def current_time(request):
now = datetime.datetime.now()
html = '<p>It is now %s.</p>' % now
return HttpResponse(html)
- 首先从
django.http
模块导入了HttpResponse
类, 以及Python的datetime
库 - 然后定义了
current_time
视图函数 - 每个视图函数都接收一个
HttpRequest
对象作为第一位置参数, 一般取名为request
. - 该视图返回一个
HttpResponse
对象, 其中包含生成的HTML页面.
自定义各种错误页面
首先在根URLconf中额外增加错误页面的条目
from django.contrib import admin
from django.urls import path
from app import views
...
# 增加的条目
handler400 = views.bad_request
handler403 = views.permission_denied
handler404 = views.page_not_found
handler500 = views.error
app/views.py
from django.shortcuts import render
from django.views.decorators.csrf import requires_csrf_token
@requires_csrf_token
def bad_request(request, exception):
return render(request, '400.html')
@requires_csrf_token
def permission_denied(request, exception):
return render(request, '403.html')
@requires_csrf_token
def page_not_found(request, exception):
return render(request, '404.html')
@requires_csrf_token
def error(request, exception):
return render(request, '500.html')
然后根据自己的需求, 创建对应的400,403,404,500四个页面.
只有当DEBUG设置为False时, 这些错误视图才会被自动执行
异步视图
Django3.1开始支持异步视图函数
编写异步视图函数, 只需要用Python的async def
关键字语法
from django.http import HttpResponse
import datetime
async def current_time(request):
now = datetime.datetime.now()
html = '<p>It is now %s.</p>' % now
return HttpResponse(html)
内置的快捷方法
render()
render(request, template_name, context=None, content_type=None, status=None, using=None)
结合一个给定的模板给一个给定的上下文字典, 返回一个渲染后的HtppResponse对象
必要参数 :
- request : 视图函数处理的当前请求
- template_name : 要使用的模板的完整名称或者模板名称的列表, 如果是一个列表, 将使用其中能够查找到的第一个模板
可选参数
- context : 添加到模板上下文的一个数据字典. 使用Python内置的locals()方法, 可以将函数作用域内的所有变量一次性添加进去
- content_type : 用于生成的文档的MIME类型, 默认为’text/html’.
- status : 响应的状态码. 默认为200
- using : 用于加载模板使用的模板引擎的NAME
redirect()
redirect(to, args, permanent=False, *kwargs)
根据传递进来的url参数, 返回HttpResponseRedirect
参数to可以是 :
- 一个模型实例 : 将调用模型的get_absolute_url()函数, 反向解析出目的url.
- URL的name名称 : 可能带有参数 : reverse()将用于反向解析url.
- 一个绝对的或相对的URL : 将原封不动的作为重定向的目标位置.
示例 :
- 调用对象的get_absolute_url()方法来重定向URL
from django.shortcuts import redirect
def my_view(request):
obj = MyModel.objects.get(...)
return redirect(obj)
- 传递URL的name名称, 内部会自动使用reverse()方法反向解析url.
def my_view(request):
return redirect('index_name', foo='bar')
get_object_or_404()
get_objects_or_404(klass, args, **kwargs)
- klass : 要获取的对象的Model类名或者Queryset等.
- **kwargs : 查询的参数
查询某个对象, 找到了则进行下一步处理, 没找到则返回404
示例 :
- 从MyModel中使用主键1获取对象
from django.shortcuts import get_object_or_404
def my_view(request):
return get_object_or_404(MyModel, pk=1)
- 还可以传递一个QuerySet实例
get_object_or_404(Book, title__startswith='M', pk=1)
get_list_or_404()
返回一个给定模型管理器上filter()的结果, 并将结果映射为一个列表, 如果结果为空则弹出Http404异常
示例 :
从MyModel中获取所有发布出来的对象
from djang.shortcuts import get_list_or_404
def my_view(request):
my_objects = get_list_or_404(MyModel, published=True)
视图装饰器
require_http_methods()
用于限制可以访问该视图的HTTP方法
from django.viewsdecorators.http import require_http_methods
@require_http_methods(["GET", "POST"])
def my_view(request):
....
serve()视图
用户上传的图片,文件等, 统称为MEDIA
为了方便在开发过程中, 对MEDIA资源的使用和测试, Django内置了一个serve()视图, 帮我们实现了通用的功能.
serve()视图只能用于开发环境
使用步骤 :
根路由urls
from django.conf import settings
from django.urls import re_path
from djang.views.static import serve
if setting.DEBUG:
urlpatterns += [
re_path(r'^media/(?P<path>.*)$', serve, {
'document_root': settings.MEDIA_ROOT,
}),
]
在settings中添加下面的配置
MEDIA_URL = '/media/'
MEDIA_ROOT = '/media/'
在Django项目的根目录下, 新建一个media文件夹, 将MEDIA资源放进去.