• Django框架7


    Django框架7


    一.多对多的三种创建方式

    1.全自动(较为常用)

    class Book(models.Model):
        title = models.CharFiel(max_length=32)
        authors = models.ManyToManyField(to='Author')
        # orm就会自动帮你创建第三张表
    
    class Author(models.Model):
        name = models.CharField(max_length=32)
        
        # 好处是:第三张表自动创建
        # 不足之处是:第三张表无法扩展额外的字段
    

    2.纯手动(了解)

    class Book(models.Model):
        title = models.CharFiel(max_length=32)
    
    class Author(models.Model):
        name = models.CharField(max_length=32)
        
    class Book2Author(models.Model):
        book = models.ForeignKey(to='Book')
        author = models.ForeignKey(to='Book')
        create_time = models.DateField(auto_now_add=True)
        # 好处是在于第三张表可以扩展额外的字段
        # 不足之处:没有了正反向查询,orm的查询会带来不便
    

    3.半自动(推荐)

    外键字段加在Book里
    class Book(models.Model):
        title = models.CharField(max_length=32)
        authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book', 'author'))
        
    class Author(models.Model):
        name = models.CharField(max_length=32)
        
    class Book2Author(models.Model):
        book = models.ForeignKey(to='Book')
        author = models.ForeignKey(to='Author')
        create_time = models.DateField(autu_now_add=True)
        
    外键字段加在Author里
    class Book(models.Model):
        title = models.CharField(max_length=32)
        
    class Author(models.Model):
        name = models.CharField(max_length=32)
        books = models.ManyToManyField(to='Book', through='Book2Author', through_fields=('author', 'book'))
        
    class Book2Author(models.Model):
        book = models.ForeignKey(to='Book')
        author = models.ForeignKey(to='Author')
        create_time = models.DateField(autu_now_add=True)
        
        # 好处在于第三张表可以扩展任意的额外的字段,还可以利用orm进行正反向查询
        # 不足之处在于:没有了add,set,remove,clear这些方法
        # 但是可以直接操作数据库
    

    二.Ajax

    同步与异步:

    ​ 同步:任务提交之后原地等待任务的返回结果 进程表现来说 阻塞

    ​ 异步: 任务提交之后不需要原地等待返回结果 直接执行下一行代码

    进程表现为 非阻塞

    ​ 任务的结果是通过异步回调机制 callback()

    Ajax:

    ​ 异步提交 局部刷新

    与后端进行交互的方式

    1.浏览器窗口输入url回车 GET

    2.a标签href属性填写url点击 GET

    3.form表单 GET/POST

    4.Ajax GET/POST

    Ajax并不是一门新的语言,它就是基于js写的一个功能模块

    ajax基本的语法结构
    $.ajax({
    	1.朝那个后端提交数据
    	url:"",	控制数据的提交方式 有三种写法 跟form表单的action属性一致
    	2.指定当前的请求方式
    	type:'post',
    	3.提交的数据
    	data:{
    	'i1': $('#i1').val(),
    	'i2': $('#i2').val()
    }
    	4.ajax是异步提交,所以需要给一个回调函数来处理返回的结果
    	success:function(data){
    		data就是异步提交返回的结果
    	将异步回调的结果通过DOM操作渲染到第三个input框中
    		$('#i3').val(data)
    }
    })
    

    为一个按钮添加绑定事件

    <script>
    $('#d1').click(function () {
    	
    })
    </script>
    script也是写在body里的
    

    后端代码

    from django.shortcuts import render, HttpResponse
    
    
    # Create your views here.
    def index(request):
    
        if request.method == 'POST':
            i1 = request.POST.get('i1')
            i2 = request.POST.get('i2')
            i3 = int(i1) + int(i2)
    
            return HttpResponse(i3)
        return render(request, 'index.html')
    

    三.content-type前后端传输数据编码的格式

    主要有三种:

    urlencoded
    formdata
    application/json
    

    form表单

    ​ 默认是urlencoded编码格式传输数据

    ​ urlencoded数据格式

    ​ username = jason&password=123

    ​ django后端针对该格式的数据,会自动解析并帮你打包到request.POST中

    ​ formdata数据格式

    ​ django后端针对符合urlencoded编码格式数据(普通键值对)还是统一解析到request.POST中

    ​ 而针对formdata文件数据就会自动解析到request.FILES中

    ajax提交

    ​ 1.ajax默认的也是urlencoed编码格式

    ​ 前后端数据交互 编码格式与数据格式一定要保持一致

    四.Ajax发送json数据格式

    ​ django后端针对jason格式数据 并不会做任何的处理

    ​ 而是直接放在request.body中

    前端代码

    <script>
    $('#d2').on('click',function(){
        $.ajax({
            url: '',
            type: 'post',
            contentType:'application/json',
            data:JSON.stringify({'username': 'jason', 'password': 123}),
            success:function(data){
                alert(data)
            }
        })
        
    })
    </script>
    

    后端代码

    def ab_ct(request):
        if request.method == 'POST':
            # # 自己来处理数据格式
            json_bytes = request.body
            # # 先解码
            # json_str = json_bytes.decode('utf-8')
            # # 再反序列化
            # json_dict = json.loads(json_str)
    
            # 这里json.loads能够自动解码并序列化
            json_dict = json.loads(json_bytes)
            print(json_dict)
        return render(request, 'ab_ct.html')
    
    

    五.Ajax发送文件数据

    ​ 内置对象 FormData

    ​ 即发普通键值对也发文件

    ​ 前端代码

    ajax发送文件数据需要借助内置对象
    <script>
    $('#d3').click(function(){
        1.需要生成一个内置对象
        var myFormData = new FormData();
        2.传普通键值对 当普通键值对较多的时候 我们可以利用for循环来添加
        myFormData.append('username', 'jason');
        myFormData.append('password', 123);
    })
        3.传文件
        myFormData.append('myfile', $( '#i3')[0].files[0]);
        发送ajax请求
        $.ajax({
            url: '',
            type: 'post',
            data: myFormData,
            发送formdata对象需要指定两个关键性参数
            processData:false, 让浏览器不需要对你的数据进行任何操作
            contentType:false, 不要使用任何的编码格式 对象formdata自带编码格式,并且django能够识别该对象
            success: function(data){
            alert(data)
        }
        })
    </script>
    

    后端

    request.POST接收字典普通键值对
    request.FILES接收文件对象
    

    六.django内置的序列化功能

    前后端数据交互的情况下都是一个大字典

    接口档案 表明该大西点内部都有哪些键值对

    from app01 import models
    from django.core import serializers
    def ab_se(request):
        user_queryset = models.Userinfo.objects.all()
        res = serializes.serialize('json', user_queryset)
        return HttpResponse(res)
    

    七.Ajax结合sweetalert实现删除二次确认

    后端代码

    from django.http import JsonResponse
    import time
    def show_user(request):
        """
        前后端如果是通过ajax进行交互 那么交互的媒介一般情况下都是一个字典
        :param request:
        :return:
        """
        if request.method == 'POST':
            time.sleep(3)
            back_dic = {"code":1000,'msg':''}
            delete_id = request.POST.get('delete_id')
            models.Userinfo.objects.filter(pk=delete_id).delete()
            back_dic['msg'] = '删除成功,准备跑路!!!'
            return JsonResponse(back_dic)
        user_queryset = models.Userinfo.objects.all()
        return render(request,'show_user.html',locals())
    

    前端代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
        {% load  static %}
        <link rel="stylesheet" href="{% static 'dist/sweetalert.css' %}">
        <script src="{% static 'dist/sweetalert.min.js' %}"></script>
        <style>
            div.sweet-alert h2 {
                padding-top: 10px;
            }
        </style>
    </head>
    <body>
    <div class="container">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <h2 class="text-center">数据展示</h2>
                <table class="table-hover table table-striped">
                    <thead>
                    <tr>
                        <th>主键</th>
                        <th>用户名</th>
                        <th>密码</th>
                        <th>性别</th>
                        <th>操作</th>
                    </tr>
                    </thead>
                    <tbody>
                    {% for user_obj in user_queryset %}
                        <tr>
                            <td>{{ user_obj.pk }}</td>
                            <td>{{ user_obj.username }}</td>
                            <td>{{ user_obj.password }}</td>
                            <td>{{ user_obj.get_gender_display }}</td>
                            <td>
                                <a href="#" class="btn btn-primary btn-xs">编辑</a>
                                <a href="#" class="btn btn-danger btn-xs cancel" data_id="{{ user_obj.pk }}">删除</a>
                            </td>
                        </tr>
                    {% endfor %}
                    </tbody>
    
                </table>
            </div>
        </div>
    </div>
    
    
    <script>
        $('.cancel').click(function () {
            var $aEle = $(this);
            swal({
                    title: "你确定要删吗?",
                    text: "你如果删了,你可要准备跑路啊!",
                    type: "warning",
                    showCancelButton: true,
                    confirmButtonClass: "btn-danger",
                    confirmButtonText: "是的,老子就要删!",
                    cancelButtonText: "惹不起惹不起!",
                    closeOnConfirm: false,
                    closeOnCancel: false,
                    showLoaderOnConfirm: true
                },
                function (isConfirm) {
                    if (isConfirm) {
                        // 发送ajax请求
                        $.ajax({
                            url:'',
                            type:'post',
                            data:{'delete_id':$aEle.attr("data_id")},
                            success:function (data) {  // 回调函数会自动将二进制的json格式数据 解码并反序列成js中的数据类型
                                if (data.code == 1000){
                                    swal("删了!", "你准备跑路吧!", "success");
                                    // 方式1
                                    {#window.location.reload()#}
                                    // 方式2 DOM操作动态修改
                                    $aEle.parent().parent().remove()  // 将标签直接移除
                                }else{
                                    swal('发生了未知的错误', "error");
                                }
                            }
                        });
    
                    } else {
                        swal("怂笔", "你成功的刷新我对你的认知", "error");
                    }
                });
        })
    </script>
    </body>
    </html>
    

    八.批量插入数据

    def ab_bc(request):
        book_list = []
        for i in range(1, 10001):
            book_list.append(models.Book(title='新的%s书'%i))
            models.Book.objects.bulk_create(book_list)
            book_queryset = models.Book.objects.all()
            return render(request, 'ab_bc.html', locals())
    

    九.自定义分页器(主要理解里面的编程思想思路)

    后端代码

    current_page = request.GET.get('page', 1)
    all_count = book_queryset.count()
    page_obj = Pagination(current_page=current_page, all_count-all_count, pager_count=9 )
    page_queryset = book_queryset[page_obj.start:page_obj.end]
    return render(request, 'ab_bc.html', locals())
    

    前端代码

    {% for book_obj in page_queryset %}
    	<p>
            {{book_obj,title}}
    </p>
    {% endfor %}
    {{ page_pbj.page_html|safe }}
    
  • 相关阅读:
    gitlab web端使用
    1、gitlab的理论知识
    git命令
    gitlab web客户端的使用
    jenkins
    jenkins pipeline
    nginx
    ELK(+Redis)-开源实时日志分析平台
    OpenStack构架知识梳理
    Linux 下的dd命令使用详解
  • 原文地址:https://www.cnblogs.com/godlover/p/12183467.html
Copyright © 2020-2023  润新知