Day66 图书管理系统,多对多关系的创建,Ajax
day 66 图书管理系统,多对多关系的创建,Ajax
今日内容概要
- 图书管理系统的增删改查
- choices 参数(数据库字段设计常见)
- MTV 与 MVC 模型
- 多对多关系的三种创建方式(之前学了一种)
- Ajax 操作(重点,全栈必备)
- 前后端传输数据编码格式
- ajax 发送 json 格式数据
- ajax 发送文件
- django 自带的序列化功能(学路飞的时候,会将更牛逼的序列化 drf)
- 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. 全自动 – 利用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···
总结
- 需要掌握《全自动》和《半自动》,一般采用《半自动》
Ajax 操作(重点,全栈必备)
八个大字,精髓
局部筛选,异步提交
例子:github 注册
动态获取用户名,实时发到后端检测
我们学过的发送请求的方式
- 地址栏输入url,只有get
- a标签的href属性,只有get
- from表单,get | post
- ajax,get | post
我们现在大部分都是 ajax。
注意
- 不是新的编程语言,是一种使用现有标准的新方法(例如装饰器)
- 不需要重新加载整个网页,就与服务器交互,更新网页数据。
- 我们只学 jQuery 封装之后的版本。原生的不太用。(不知 jQuery,其他框架也可以,就是关键字不同,换汤不换药)
- 所以一定要确保导入了 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')
- 如果后端返回的是 HttpResoponse,只能在前端,Json.parse() 自己解决
- 如果后端返回的是 JsonResponse ,前端会自动帮你反序列化
dataType: 'Json',
import json
def ab_ajax(request):
...
# 这里 d 是个字典。
return JsonResponse(d)
...
以后写 ajax 的时候,可以直接加上,以防万一。