-
视图层之必会三板斧
-
JsonResponse对象
-
视图层之request对象获取文件
-
视图层之FBV与CBV
-
CBV源码剖析(重要)
-
模板层
视图层之必会三板斧
# 用来处理请求的视图函数都必须返回HttpResonse对象
完全正确
# HttpResonse
class HttpResonse:
pass
return HttpResonse()
# render
def render():
return HttpResponse()
return render()
# redirect
def redirect():
redirect_class = 类(祖先有个类是HttpResponse)
return redirect_class()
return redirect()
'''多继承'''
JsonResponse对象
- json模块
user_dict = {'name':'jason','age':18}
import json
user_json = json.dumps(user_dict)
return HttpResponse(user_json)
user_dict = {'name':'jason','age':18,'hobby':'起飞'}
import json
user_json = json.dumps(user_dict)
return HttpResponse(user_json)
'''出现乱码'''
ensure_ascii=False
- JsonResponse对象
from django.http import JsonResponse
user_dict = {'name': 'jason', 'age': 18, 'hobby': '起飞'}
return JsonResponse(user_dict, json_dumps_params={'ensure_ascii': False})
ps:以后写代码很多时候可能需要参考源码及所学知识扩展功能
class JsonResponse(HttpResponse):
def __init__(self,data,json_dumps_params=None):
json.dumps(data,**json_dumps_params)
JsonResponse主要序列化字典 针对非字典的其他可以被序列化的数据需要修改safe参数为False
视图层之request对象获取文件
# form表单上传文件
form表单携带文件类型的数据需要做到以下几点
1.method必须是post
2.enctype必须修改为multipart/form-data
# 默认是application/x-www-form-urlencoded
3.django后端需要通过request.FILES获取文件类型的数据
视图层之FBV与CBV
FBV
基于函数的视图
def index(request):return HttpResponse对象
CBV
基于类的视图
from django import views
class MyLoginView(views.View):
def get(self, request):
return HttpResponse('from CBV get function')
def post(self, request):
return HttpResponse('from CBV post function')
CBV路由匹配:
path('login/', views.MyLoginView.as_view())
"""
如果请求方式是GET 则会自动执行类里面的get方法
如果请求方式是POST 则会自动执行类里面的post方法
"""
CBV源码解剖(重要)
# 切入点:路由匹配
path('login/', views.MyLoginView.as_view())
类名点名字(名字的查找问题)
类名点名字并加括号调用(静态方法、绑定给类的方法)
as_view 可能是普通的静态方法
as_view 可能是绑定给类的方法
# 独享查找属性的顺序
先从对象自身开始、再从产生对象的类、之后是各个父类
MyLoginView.as_view()
先从我们自己写的MyLoginView中查找
没有再去父类Views中查找
# 函数名加括号执行优先级最高
项目一启动就会自动执行as_view方法
path('login/', views.view) # CBV路由本质还是FBV
# 浏览器地址栏访问login路由需要执行view函数
产生我们自己编写类的对象
对象调用dispatch方法(注意查找顺序)
# 研究父类中的dispatch方法
获取当前请求方法并转小写 之后利用反射获取类中对应的方法并执行
class View:
@classmethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
self = cls(**initkwargs)
return self.dispatch(request, *args, **kwargs)
def dispatch(self, request, *args, **kwargs):
handler = getattr(self, request.method.lower())
return handler(request, *args, **kwargs)
模板层
"""
django提供的模板语法只有两个符号
{{}}:主要用于数据值相关操作(引用)
{%%}:主要用于逻辑相关操作(循环、判断)
django的模板语法是自己写的 跟jinja2不一样
1.针对需要加括号调用的名字 django模板语法会自动加括号调用你只需要写名字就行
2.模板语法的注释前端浏览器是无法查看的 {##}
"""
# 模板语法传值的两种方式
传值方式1:精准传值 不浪费资源 针对多资源的传递书写麻烦
name = 'gavin'
return render(request, 'mb_a文件.html',{'name':name})
传值方式2:将函数名称空间中所有的名字全部传递 名字过多并且不使用的情况下比较浪费资源
return render(request, 'ab_temp.html', locals())
'''locals() 将当前名称空间中所有的名字全部传递给html页面'''
# 模板语法传值特性
1.基本数据类型正常展示
2.文件对象也可以展示并调用方法
3.函数名会自动加括号执行并将返回值展示到页面上(不支持额外传参)
4.类名也会自动加括号调用
5.对象则不会
ps:总结针对可以加括号调用的名字模板语法都会自动加括号调用
模板语法之过滤器(内置函数)
过滤器 | 用法 | 代码 |
---|---|---|
last | 获取列表/元组的最后一个成员 | {{liast | last}} |
first | 获取列表/元组的第一个成员 | {{list|first}} |
length | 获取数据的长度 | {{list | length}} |
defualt | 当变量没有值的情况下, 系统输出默认值, | {{str|default="默认值"}} |
safe | 让系统不要对内容中的html代码进行实体转义 | {{htmlcontent| safe}} |
upper | 字母转换成大写 | {{str | upper}} |
lower | 字母转换成小写 | {{str | lower}} |
title | 每个单词首字母转换成大写 | {{str | title}} |
date | 日期时间格式转换 | `{{ value |
cut | 从内容中截取掉同样字符的内容 | {{content | cut:"hello"}} |
list | 把内容转换成列表格式 | {{content | list}} |
add | 加法 | {{num| add}} |
filesizeformat | 把文件大小的数值转换成单位表示 | {{filesize | filesizeformat}} |
join |
按指定字符拼接内容 | {{list| join("-")}} |
random |
随机提取某个成员 | {list | random}} |
slice |
按切片提取成员 | {{list | slice:":-2"}} |
truncatechars |
按字符长度截取内容 | {{content | truncatechars:30}} |
truncatewords |
按单词长度截取内容 | 同上 |