1.ORM操作之CBV操作
CBV模式:基于类的视图模块
FBV模式:基于函数的试图模块
1.1.CBV模式的url格式
url(r'^test\.html$',views.Test.as_view()),
1.2.CBV模式的视图內容
from django.views import View
from django.shortcuts import HttpResponse
class Test(View):
'''
django中默认支持http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']访问方式
当匹配完url后,首先执行View中的dispatch方法;通过反射的方式获得访问方式所对应的响应方法
可以利用dispa方法实现装饰器的功能
'''
def dispatch(self, request, *args, **kwargs):
print("执行响应方法前执行的內容")
response_func = super().dispatch(request,*args, **kwargs)
print("执行响应方法后执行的內容")
return response_func
# 定义一个响应GET请求的方法
def get(self,request):
# return HttpResponse("get function")
return render(request,'test.html')
# 定义一个响应POST请求的方法
def post(self,request):
return HttpResponse("post function")
1.3.CBV模式中响应函数的名称与访问方式相同,通过访问方式执行响应函数
2.ORM外键之方向查找
正向查找:即通过外键名跨表到外键所依赖的表中
反向查找:通过隐藏的字段(表的类名小写_set)跨表到外键所在表中
# 外键方向查找
scline = models.School.objects.filter(sid=1)
print("学校信息:",scline[0].sid,scline[0].sc_name)
print("学校所对应的班级信息:")
class_list = scline[0].classes_set.all()
for row in class_list:
print(row.cid,row.class_name)
2.1.ORM操作之通过values获取指定字段返回字典
r1 = models.Classes.objects.all().values("class_name")
print("r1:",r1)
# ORM操作之通过values_list获取指定字段返回元组
# r1: <QuerySet [{'class_name': 'class'}, {'class_name': 'class'}, {'class_name': 'newuser03'}, {'class_name': 'class'}, {'class_name': 'class'}]>
r2 = models.Classes.objects.all().values_list("class_name")
print("r2:", r2)
# r2: < QuerySet[('class',), ('class',), ('newuser03',), ('class',), ('class',)] >
# ORM之通过values或values_list实现跨表操作
r3 = models.Classes.objects.all().values("class_name", "cs__sc_name")
print("r3:", r3)
# r3: <QuerySet [{'class_name': 'class', 'cs__sc_name': '天斗皇家学院'}, {'class_name': 'class', 'cs__sc_name': '天斗皇家学院'}, {'class_name': 'newuser03', 'cs__sc_name': '天斗皇家学院'}, {'class_name': 'class', 'cs__sc_name': '天斗皇家学院'}, {'class_name': 'class', 'cs__sc_name': '天斗皇家学院'}]>
3.django做分页
def test(request):
current_page = requests.GET.get("page")
from django.core.paginator import Paginator,Page
# 获取所有数据
class_list = models.Classes.objects.all()
# args1:要显示的数据,args2:分成多少页
paginator = Paginator(class_list,10)
# 当前显示第几页
posts = paginator.page(current_page)
return render(requests,'index.html',{"posts":posts})
3.1分页的页面代码:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>ORM单表操作</title>
</head>
<body>
<h1>ORM单表操作</h1>
<table border="1">
<thead>
<tr>
<th>#ID</th>
<th>班级名称</th>
</tr>
</thead>
<tbody>
{% for row in posts.object_list %}
<tr>
<td>{{ row.cid }}</td>
<td>{{ row.class_name }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div>
{% if posts.has_previous %}
<a href="/index.html?page={{ posts.previous_page_number }}">上一页</a>
{% endif %}
{# 获取所有页数,是djano分页的极限,只适合做上一页下一页的分页操作#}
{% for i in posts.paginator.page_range %}
<a href="/index.html?page={{ i }}">{{ i }}</a>
{% endfor %}
{% if posts.has_next %}
<a href="/index.html?page={{ posts.next_page_number }}">下一页</a>
{% endif %}
</div>
<a href="/add_class.html">添加班级</a>
</body>
</html>
分页效果图:django自带分页适合做只有上一页下一页的操作,不适合做带页码的操作,所有的页码都回显示出来