一、MTV与MVC

1、MTV模型(Django):

M:模型层(models.py)

T:模板层 (templates)(HTML文件存放处)

V:视图层(views)

 

2、MVC模型:

M:模型层(models.py)

V:视图层(views.py)

C:控制器(Controller)对应urls.py

 

本质:Django的MTV也是MVC

 

二、多对多表的三种创建方式

1、Django里的ORM自动帮我们创建

class Book(models.Model):
name = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Author')


class Author(models.Model):
name = models.CharField(max_length=32)

 

2、我们自己纯手动创建第三张表

class Book(models.Model):
    name = models.CharField(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='Author')
    info = models.CharField(max_length=32)

 

3、半自动创建第三张表(可拓展性高,并且能够符合ORM查询)

class Book(models.Model):
    name = 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)
    # book = models.ManyToManyField(to='Book',through='Book2Author',through_fields=('author','book'))


class Book2Author(models.Model):
    book = models.ForeignKey(to='Book')
    author = models.ForeignKey(to='Author')
    info = models.CharField(max_length=32)

 

三、AJAX

1、前端向后端发请求的方法:

  • 浏览器窗口手动输入网址          get请求
  • a标签的href属性             get请求
  • form表单                 get/post请求(默认为get请求)
  • Ajax                 get/post请求

 

2、Ajax特点:

  • 异步提交
  • 局部刷新

 

3、Ajax基本语法

// 提交的地址(url)
// 提交的方式(type)
// 提交的数据(data)
// 回调函数(success)
$('#d1').click(function () {
    $.ajax({
        // 提交的地址
        url:'/index/',
        // 提交的方式
        type:'post',
        // 提交的数据
        data:{'name':'jason','password':'123'},
        // 回调函数
        success:function (data) {  // data接收的就是异步提交返回的结果
            alert(data)
        }
    })
})    

 

4、Ajax默认传输数据的编码格式也是urlencoded

 

5、前后端传输数据

  • 数据与编码要一一对应

 

5.1、Ajax传输json格式数据

    $('#d1').click(function () {
        $.ajax({
            url:'',  // url参数可以不写,默认就是当前页面打开的地址
            type:'post',
            contentType:'application/json',
                                   
            data:JSON.stringify({'name':'jason','hobby':'study'}),
            success:function (data) {
                {#alert(data)#}
                {#$('#i3').val(data)#}
            }
        })
    });        

 

5.2、Ajax传输文件

$('#d1').click(function () {
    let formdata = new FormData();
    // FormData对象不仅仅可以传文件还可以传普通的键值对
    formdata.append('name','jason');
    // 获取input框存放的文件
    //$('#i1')[0].files[0]
    formdata.append('myfile',$('#i1')[0].files[0]);
    $.ajax({
        url:'',
        type:'post',
        data:formdata,
        // ajax发送文件需要修改两个固定的参数
        processData:false,  // 告诉浏览器不要处理我的数据
        contentType:false,  // 不要用任何的编码,就用我formdata自带的编码格式,django能够自动识别改formdata对象
        // 回调函数
        success:function (data) {
            alert(data)
        }
    })
});

 

补充:1、form表单与Ajax的异同点

  • form表单不支持异步提交局部刷新
  • form表单不支持传输json格式数据
  • form表单与ajax默认传输数据的编码格式都是urlencoded

   2、批量插入数据

l = []
    for i in range(10000):
        l.append(models.Book2(name='第%s本书'%i))
    models.Book2.objects.bulk_create(l)  # 批量插入数据
    

注意:

<li><a href="?page=1">1</a></li>  <--!自动补全当前路径-->

 

四、自定义分页器

# 后端:
    book_list = models.Book2.objects.all()
    # 数据总条数
    all_count = book_list.count()
    # 当前页
    current_page = request.GET.get('page',1)
    # 示例一个分页器对象
    page_obj = my_page.Pagination(current_page=current_page,all_count=all_count)
    # 对总数据进行切片
    page_queryset = book_list[page_obj.start:page_obj.end]
        

# 前端
    {{ page_obj.page_html|safe }}  # 帮你渲染的是带有bootstrap样式的分页器