Day66 图书管理系统,多对多关系的创建,Ajax

本文介绍了Django中图书管理系统的增删改查,探讨了choices参数在数据库字段设计中的应用,以及MTV与MVC模型的区别。重点讲解了多对多关系的全自动、纯手动和半自动创建方式,并强调了Ajax操作在全栈开发中的重要性,包括Ajax的使用场景、注意事项及小实例。
摘要由CSDN通过智能技术生成

day 66 图书管理系统,多对多关系的创建,Ajax

今日内容概要

  1. 图书管理系统的增删改查
  2. choices 参数(数据库字段设计常见)
  3. MTV 与 MVC 模型
  4. 多对多关系的三种创建方式(之前学了一种)
  5. Ajax 操作(重点,全栈必备)
  6. 前后端传输数据编码格式
  7. ajax 发送 json 格式数据
  8. ajax 发送文件
  9. django 自带的序列化功能(学路飞的时候,会将更牛逼的序列化 drf)
  10. ajax 结合 sweetalert 实现删除按钮的二次确认操作

今日内容详细


图书管理系统的增删改查

1. 我的图书管理系统
1. 反向解析:把前端页面里面的变量传给后端。{% url '函数名' 对象的变量名 %}

choices 参数(数据库字段设计常见)

设计一个表,比如用户表。
性别,学历,工作经验,客户来源……
能够列举完全的字段,那么一般情况下采用 choices 参数

取的时候用 get_字段_display() 方法

# 存,没有被列举出来的书子也可以存
models.User.objects.create(username='jason', age=18, gender=1)
models.User.objects.create(username='egon', age=84, gender=2)
models.User.objects.create(username='tank', age=40, gender=3)
models.User.objects.create(username='tony', age=30, gender=4)


# 取,用 get_字段_display() 方法
user_obj = models.User.objects.filter(pk=1).first()
print(user_obj.gender, user_obj.get_gender_display())
# 如果没有对应字段,那存的是什么,取出还是什么
user_obj = models.User.objects.filter(pk=4).first()
print(user_obj.gender, user_obj.get_gender_display())

models.py

class User(models.Model):
    username = models.CharField(max_length=32)
    age = models.IntegerField()
    # 性别
    gender_choice = (
        (1, '男'),
        (2, '女'),
        (3, '其他'),
    )
    gender = models.IntegerField(choices=gender_choice)

    '''
    gender 字段存的还是数字,
    保证 choices 字段和字段内类型一致即可。
    '''

MTV 与 MVC 模型

这些简称没有任何卵用
MTV:django 给自己起的别名,本质还是 MVC
models,templates,views。
models,views,controller(urls.py,)


多对多关系的三种创建方式(之前学了一种)

  1. 全自动
  2. 纯手动
  3. 半自动

例如,图书与作者关系

1. 全自动 – 利用orm帮我们创建

class Book(models.Model):
    ...
    authors = models.ManyToManyField(to='Author')
    ...
  • 优点

    • 不用写代码,方便,快速
  • 缺点

    • 第三张表的扩展性极差

2. 纯手动

class Book2Author(models.Model):
    ...
    book_id = models.ForeignKey(to='Book')
    author_id = models.ForeignKey(to='Author')
    ...
  • 优点
    • 第三张表完全取决于你
  • 缺点
    • 代码太多,无法使用 orm 提供的正反向查询和简单方法(add,set,remove,clear···)
  • 不推荐使用《纯手动》

3. 半自动

class Book(models.Model):
    ...
    authors = models.ManyToManyField(
        to='Author', 
        through='Book2Author', 
        through_field=('book', 'author'), 
    )
    ...

class Author(models.Model):
    ...

# Book2Author 还是需要自己写,在 Book 中关联
class Book2Author(models.Model):
    ...
    book_id = models.ForeignKey(to='Book')
    author_id = models.ForeignKey(to='Author')
    ...

半自动可以使用正反向查询,但是依旧不能使用 add,set,remove,clear···

总结

  1. 需要掌握《全自动》和《半自动》,一般采用《半自动》

Ajax 操作(重点,全栈必备)

八个大字,精髓

局部筛选,异步提交

例子:github 注册
动态获取用户名,实时发到后端检测

我们学过的发送请求的方式

  1. 地址栏输入url,只有get
  2. a标签的href属性,只有get
  3. from表单,get | post
  4. ajax,get | post

我们现在大部分都是 ajax。

注意

  1. 不是新的编程语言,是一种使用现有标准的新方法(例如装饰器)
  2. 不需要重新加载整个网页,就与服务器交互,更新网页数据。
  3. 我们只学 jQuery 封装之后的版本。原生的不太用。(不知 jQuery,其他框架也可以,就是关键字不同,换汤不换药)
  4. 所以一定要确保导入了 jQuery。

小例子

<input type="text" name="" id="d1">+
<input type="text" name="" id="d2">=
<input type="text" name="" id="d3">
<p>
    <button id="btn">点我</button>
</p>

<script>
    // 用 jquery 给按钮绑定一个点击事件
    $('#btn').click(function(){
        // 朝后端发送 ajax 请求
        $.ajax({
            url: '',
            type: 'post',
            dataType: 'Json',
            data: {'i1': $('#d1').val(), 'i2': $('#d2').val()},
            success:function(args){
                // alert(args)
                $('#d3').val(args)
            }
        })
    })
</script>
  • 最后一个success是回调函数(形参写什么都可以)。无论输入啥,最后都是返回给回调函数。不是浏览器。
  • 如果要返回字典的话,需要用 json 格式。
  • 不管什么格式,前端(这个页面)收到的参数都是字符串格式。
def ab_ajax(request):
    if request.method == "POST":
        print(request.POST)
        i1 = request.POST.get('i1')
        i2 = request.POST.get('i2')
        i3 = int(i1) + int(i2)
        return HttpResponse(i3)
    return render(request, 'ab_ajax.html')
  1. 如果后端返回的是 HttpResoponse,只能在前端,Json.parse() 自己解决
  2. 如果后端返回的是 JsonResponse ,前端会自动帮你反序列化 dataType: 'Json',
import json

def ab_ajax(request):
    ...
    # 这里 d 是个字典。
    return JsonResponse(d)
    ...

以后写 ajax 的时候,可以直接加上,以防万一。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值