django之CBV模式,反向查找及自带分页

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自带分页适合做只有上一页下一页的操作,不适合做带页码的操作,所有的页码都回显示出来


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值