day10图书编辑删除 字段参数choise(重要)多对多三种创建方式 ajax语法结构
day10图书编辑删除 字段参数choise(重要)多对多三种创建方式 ajax语法结构
昨日内容复习
Q查询
# Q查询功能1.可以改变查询条件的链接关系 比如 and or 2.可以改变查询条件左侧的条件(变量名>>>字符串) from django.db.models import Q #先导入 # 基本使用 models.User.objects.filter(Q(title='三'),Q(price=11.11)) and models.User.objects.filter(Q(title='三')|Q(price=11.11)) or models.User.objects.filter(~Q(title='三'),Q(price=11.11)) not (title='三')and xxx # 进阶使用 q_obj = Q() q_obj.connector = 'or' # 默认是and q_obj.children.append(('title','三')) q_obj.children.append(('price',11.11)) models.User.objects.filter(q_obj)orm操作事务
orm操作事务
from django.db import transaction # 方式1:装饰器 @transaction.atomic # 方式2:with上下文 with transaction.atomic(): #开启事务 transaction.rollback() #回滚 transaction.commit() #确认
orm查询优化
only与defer#only方法返回一个对象的数据集,里面默认存了括号内指定字段的数据, 对象点击only括号内填写的字段名称不会再走数据库查询,但是点击括号内不存在的字段名称则每次都会走数据库查询#defer和only相反 对象点字段名 ,对象点击only括号内填写的字段名称走数据库查询,但是点击括号内不存在的字段名称则不会走数据库查询 select_related与prefetch_related只能是一对一和一对多select_related方法只能写外键 会执行连表操作,表拼接在一起,表中所有数据全部封装到数据对象中,之后对象无论查询哪个表的数据都不再走数据库查询 一条sql语句prefetch_related只能写外键 相当于子查询操作,先查询一张表 ,再把关联的表数据也查询出来,在封装到数据对象中 两条sql语句
orm字段类型和常用参数
# orm除了提供大量的字段类型之外还支持自定义字段类型 AutoField() CharField() DecimalField() DateField() DateTimeField() IntergerField() BigIntergerField() BooleanField() TextField() FileField() EmailField() ###############常用参数 null default unique db_index max_length auto_now auto_now_add to to_field related_name verbose_name
今日内容概要
图书的编辑
图书的删除
字段参数之choices(重要)
多对多三种创建方式
MTV与MVC理论
ajax语法结构(固定的)
请求参数contentType
ajax如何传文件及json格式数据
今日内容详细
图书的编辑
1.urls指定#图书编辑页面url(r'^book_edit/(\d+)',views.book_edit,name='be'), 2.去创建对应的views视图 def book_edit(request,edit_id):#1.获取用户想要编辑的数据对象edit_obj=models.Book.objects.filter(pk=edit_id).first()if request.method=='POST':title = request.POST.get('title')price = request.POST.get('price')publish_time = request.POST.get('publish_time')publish_pk = request.POST.get('publish_pk')author_pk_list = request.POST.getlist('author_pk_list')models.Book.objects.filter(pk=edit_id).update(title=title,price=price,publish_time=publish_time,publish_id=publish_pk)edit_obj.authors.set(author_pk_list)return redirect('bl')#2.返回一个页面 页面显示要编辑的数据#3.创建出版社对象 作者对象并返回publish_queryset=models.Publish.objects.all()author_queryset=models.Author.objects.all()return render(request,'book_edit.html',locals()) 3.返回的html界面 {% extends 'home.html' %}{% block content %}<h2 class="text-center">图书编辑页面</h2><form action="" method="post"><p>书名<input type="text" name="title" class="form-control" value="{{ edit_obj.title }}"></p><p>价格<input type="text" name="price" class="form-control" value="{{ edit_obj.price }}"></p><p>出版日期<input type="date" name="publish_time" class="form-control" value="{{ edit_obj.publish_time|date:'Y-m-d' }}"></p><p>出版社 {# 循环所有的出版社对象跟书籍对象出版社比对 如果一致 添加selected#}<select name="publish_pk" id="" class="form-control">{% for publish_obj in publish_queryset %}{% if publish_obj == edit_obj.publish %}<option value="{{ publish_obj.pk }} " selected>{{ publish_obj.name }}</option>{% else %}<option value="{{ publish_obj.pk }}">{{ publish_obj.name }}</option>{% endif %}{% endfor %}</select></p><p>作者<select name="author_pk_list" id="" class="form-control" multiple>{% for author_obj in author_queryset %}{% if author_obj in edit_obj.authors.all %}<option value="{{ author_obj.pk }}" selected>{{ author_obj.name }}</option>{% else %}<option value="{{ author_obj.pk }}">{{ author_obj.name }}</option>{% endif %}{% endfor %}</select></p><input type="submit" value="编辑成功" class="btn btn-primary btn-group"></form> {% endblock %}
图书的删除
1.urls路由层#图书删除页面url(r'^book_delete/(?P<delete_id>\d+)/',views.book_delete,name='bd') 2.views视图层 def book_delete(request,delete_id):models.Book.objects.filter(pk=delete_id).delete()return redirect('bl') 3.html界面没有 这个就是做了一个简单删除动作 直接指向了展示页
字段参数之choices(重要)
有的时候我们发现表的字段有的是不能输入的只能选择 比如性别字段 男 女...学历字段 大专 本科 研究生 博士 ... 诸如此类字段 推荐使用choices参数比如 1.先在models 创建一个表 class User(models.Model):name=models.CharField(max_length=32)age=models.IntegerField()#先创建一个gender_choise 存放对应关系gender_choise=((1,'男'), #这里面数字 字符串都可以 但是保证一致 前面都是字符串 或都是数字 对应的后面都是字符串或数字(2,'女'),(3,'未知'))gender=models.IntegerField(choices=gender_choise) #这里需要用choise指定 刚才的对应关系 2.执行数据库迁移,并存入数据 #注意存数据时候 gender这个字段是整形 只能存定义时候有关系的 存4也行 但是获取时候只能是4 3.创建user对象并调用gender import osif __name__ == "__main__":os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")import djangodjango.setup()from app01 import modelsuser_obj=models.User.objects.filter(pk=1).first()print(user_obj.gender) # 1print(user_obj.get_gender_display()) #男 '''如果没有对应关系则返回数据本身'''
多对多三种创建方式
#第一种:自动创建定义外键的时候直接指定ManyToManyField(to='关联的表名') 就是自动创建优点:不用我们编写第三张关系表代码缺点:第三张关系表 字段固定,无法扩展 #第二种:手动创建class Book(models.Model):passclass Author(models.Model):passclass Book2Author(models.Model):book_id = models.ForeignKey(to='Book') #相当于外键指到book表author_id = models.ForeignKey(to='Author') #相当于外键指到authorbond_time = models.DateField(auto_now=True) #自己新增的字段优点:第三张表可以无限制的扩展字段缺点:需要手动编写第三张表,用orm正反向查询时候不方便,不知道是正向还是反向,因为外键字段两张表都没有 #第三种:半自动半手动创建 两张表都手动创建 第三张关系表也要手动创建 外键字段多对多 建在哪个表都行class Book(models.Model):authors = models.ManyToManyField(to='Author', #指向author表through='Book2Author' # 告诉orm第三张关系表是谁不要自动创through_fields=('book_id','author_id') # 在第三张表 通过哪两个字段实现了多对多 在book表 bookid在前)class Author(models.Model):# 多对多外键字段在orm中可以建在任意一张关联表中 上面是在book建 下面是在auhor建books = models.ManyToManyField(to='Book',through='Book2Author' # 告诉orm第三张关系表是谁不要自动创through_fields=('author_id','book_id') # 通过哪两个字段 在author表 author_id 在前)class Book2Author(models.Model):book_id = models.ForeignKey(to='Book')author_id = models.ForeignKey(to='Author')bond_time = models.DateField(auto_now=True)
MTV与MVC理论
MTV模型M:models模型层T:template模板层V:views视图层MVC模型M:models模型层V:views视图层C:controllar控制层(urls.py...) """ django自称为MTV模型 其实本质也还是MVC模型大部分的web框架都属于MVC """
ajax语法结构(固定的)
# 特征:异步提交 局部刷新 """使用jQuery封装的ajax一定要记得先引入ajax资源""" 异步:提交完任务之后 不愿地等待任务的结果 执行别的 ,有返回结果 自动通过一个回调机制再回来 比如 注册界面 你输入了用户名 他会自动传给后端 告诉你用户名已存放 或者用户名可以使用 局部刷新 AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程) AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。 """ 可以发送网络请求的标签a标签 GET请求form表单 GET请求 POST请求ajax技术 GET请求 POST请求 """ # ajax并不是一门新的技术 而是有js代码演变而来 相当于我们python基础所学的装饰器(名称空间 函数对象 闭包函数) # jQuery封装之后的ajax代码(格式固定 并且语法简单 好记) # 其他框架也可以封装ajax技术基本语法格式 //1.查找计算按钮标签$.ajax({url:'' , //向谁发请求(from 的action一样 不写 后缀 全路径)type:'post', //请求的方式(get post)data:{'username':'zhang','pwd':123}, // 请求携带的数据数据success:function (args) { //异步回调机制(后端返回数据自动触发的操作)'回调执行的操作'}#加法运算 三个输入框 一个按钮 页面不能刷新 采用ajax #views def ab_ajax(request):if request.method == 'POST':#获取i1 i2i1 = request.POST.get('i1')i2 = request.POST.get('i2')res = int(i1) + int(i2)return HttpResponse(res)return render(request, 'ab_ajax.html' ) ############################################################################## #ab_ajax.html <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script> </head> <body><input type="text" id="i1">+<input type="text" id="i2">=<input type="text" id="i3"><button id="d1">计算</button><script>//1.查找计算按钮标签let $btnEle=$('#d1');//根据id查找标签对象//2.给按钮标签绑定点击事件 两种方式 on$btnEle.on('click',function () {//2.1获取输入框的内容 先查找到输入框之后获取里面的value属性let i1val=$('#i1').val(); //val 拿value值let i2val=$('#i2').val(); //val 拿value值//3.发送ajax请求$.ajax({url:'' , //向谁发请求(from 的action一样 不写 后缀 全路径)type:'post', //请求的方式(get post)data:{'i1':i1val,'i2':i2val}, // 请求携带的数据数据 字典的形式success:function (args) { //异步回调机制(后端返回数据自动触发的操作)$('#i3').val(args) //val(里面写内容是赋值 不写内容是拿这个框内容 )}})})//第二种绑定点击事件{#$btnEle.click(function () {#}{# alert('我不好')#}//})</script></body> </html>
请求参数contentType
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 #说明了数据的组织格式 后端通过该参数就可以提前明确数据格式之后采取对应的处理措施操作数据 比如提前告诉你 我要给你发什么数据Content-Type 数据类型ajax磨人的数据格式为 urlencoded: i1=12&i2=2针对该类型的数据:django会自动处理到request.POST中 后端用request.POST接受#form表单只能发送 urlencoded 和 formdata格式数据 form表单默认的数据格式也是urlencoded该格式数据:i1=123213&i2=12313针对该类型的数据:django会自动处理到request.POST中 后端用request.POST接受 form表单还可以发送数据格式为formdata该格式数据无法查看到 封装成二进制发送给后端针对该类型的数据:普通的数据还是解析到request.POST中 文件类型的数据解析到request.FILES中
ajax如何传文件及json格式数据
"""
python中序列化反序列化import jsonjson.dumps()json.loads()
Js中序列化反序列化JSON.stringify()JSON.parse()
"""
django针对json格式数据没有指定任何东西去处理 ,放在了request.body里面#html
<body>
<button id="b1">发送json格式数据</button>
<script>//1.查找按钮let $btn=$('#b1')//2.给按钮绑定单击事件$btn.on('click',function () {//3.发送ajax请求$.ajax({url:'' ,//向谁发请求空为当前页面type:'post', //请求方式data:JSON.stringify({'name':'aaa','pwd':123}), //发送的数据 json数据需要序列化一下contentType:'application/json', //类似于报头 指定传给你json数据success:function (args) {//异步回调机制(后端返回数据自动触发的操作)alert(args)}})})</script>
</body>#views
def ac_ajax(request):if request.method == 'POST':print(request.POST)#获取不到json格式数据 <QueryDict: {}>print(request.GET) #获取不到json格式数据 <QueryDict: {}>print(request.FILES)#获取不到json格式数据<MultiValueDict: {}>print(request.body)#能获取到 但是是二进制 b'{"name":"aaa","pwd":123}'#json.loads 可以自动解码并序列化 不需要decode了import jsonjson_dict=json.loads(request.body)print(json_dict,type(json_dict)) #{'name': 'aaa', 'pwd': 123} <class 'dict'>return HttpResponse('123')return render(request,'ac_ajax.html')
day10图书编辑删除 字段参数choise(重要)多对多三种创建方式 ajax语法结构相关推荐
- Django 数据库查询优化,choices参数(数据库字段设计常见),MVC和MTV模型,多对多三种创建方式...
数据库查询优化 orm语句的特点:惰性查询 如果仅仅只是书写了orm语句,在后面没有用到该语句所查询出来的参数,那么orm会自动识别,并不执行 举例: res = models.Book.object ...
- Django09:图书管理系统笔记/choices用法/ MTV与MVC模型/多对多三种创建方式
图书管理系统笔记 redirect括号内可以直接写url 也可以直接写别名 但如果别名需要参数,必须使用reverse解析. choices用法 使用场景:能列举完全的数据 #使用方法:xxx_cho ...
- 批量删除的三种实现方式
vue+springboot实现批量删除的三种实现方式 1.Post请求方式 前端代码 //参数封装 handleSelectionChange(val){this.multipleSelection ...
- 两部苹果手机同步照片_怎么恢复苹果手机删除的照片?今天教你三种找回方法...
原标题:怎么恢复苹果手机删除的照片?今天教你三种找回方法 怎么恢复苹果手机删除的照片?手机的出现虽然带给我们很大便利,同时却也带来了一些小的麻烦.在手机上很多操作步骤都很简单,因此,难免会遇到手滑误操 ...
- element的表格index自定义_vue+element-ui实现表格编辑的三种实现方式
1.表格内部显示和编辑切换 这种方式就是利用两个标签显示隐藏来实现,我们这里用input和span,正常用span将数据显示,点击编辑时,将span隐藏,显示input进行编辑.选中当前行我们可以通过 ...
- 易语言删除数组里的指定成员的三种方法
我们想从从数组里删除指定成员的时候,首先要遍历数组, 找到对应的成员名称,然后使用删除成员命令来删除.以下提供了三种思路. 方法一: 窗口程序集名 保 留 保 留 备 注 窗口程序集1 子程序名 返回 ...
- 启动指定参数_SpringBoot的三种启动方式
1.背景 这几天在看面试题,看到了有关SpringBoot的相关知识点,其中有一个问题是:"SpringBoot有哪几种启动方式?".一下子懵逼了,脑子里面只记得在本地启动的时候是 ...
- range函数python三个参数_range()函数三种参数的用法
第8篇分享 range()是python的内置函数,用的地方挺多的,目前我经常会在for循环中作为循环的次数来使用,其实range()的用法不仅仅如此,本文给大家介绍下range()函数的三种参数的基 ...
- 共享里的文件被删除了怎么办?可尝试这三种恢复方法
共享里的文件被删除了怎么恢复?删除之后就马上去回收站找,可是没回收站里没有怎么办?--来自某xx小伙伴的咨询.如果你也出现同样的疑惑,那么可以尝试下面的三种方法恢复共享里的文件. 方法一.以前的版本恢 ...
- 苹果6s怎么导出照片_怎么恢复苹果手机删除的照片?今天教你三种找回方法
怎么恢复苹果手机删除的照片?手机的出现虽然带给我们很大便利,同时却也带来了一些小的麻烦.在手机上很多操作步骤都很简单,因此,难免会遇到手滑误操作的情况.拿照片这项内容来说,我们可能误删除一些本来不需要 ...
最新文章
- 如何添加ORACLE 的 ODBC
- 东北农业大学农学院程晓非教授荣获植物病毒学国家“优青”资助
- 控制好节奏,踏实做好每件事
- 深入理解编译注解(四)常用接口介绍
- POJ 1321 棋盘问题(DFS 状压DP)
- HDU5697 刷题计划 dp+最小乘积生成树
- git push前请先git pull
- 栅格像元做地理坐标映射后的坐标值是像元中心点还是其他位置?
- 从程序员到技术领导者
- 扔掉老破V100、A100,英伟达新一代计算卡H100来了!
- snmp是什么层协议_计算机网络基础:TCP/IP协议相关知识笔记?
- Windows on Device 项目实践 1 - PWM调光灯制作
- DatabaseDesign数据库设计
- 极客大学架构师训练营 性能测试 性能优化 第七次作业
- MySQL5.5安装包 安装详解
- switch 大气层双系统 进入破解系统 及安装nsp nsz 格式教程
- android 邮箱注册功能,手机邮箱怎么注册登录(安卓手机邮箱设置教程)
- 计算机要重启电脑才能检测出u盘启动,u盘要电脑重启才能用
- Sue Shallow
- 登机牌条码(python)
热门文章
- Mono.Cecil简介与示例
- 2013,我的创业记忆片段
- 基于WEMOS的智能WiFi避障小车
- 买房的疯了-开发商笑不起来了(本文仅供新浪)
- Html div 打印自动分页,真正好用的网页打印和分页方法:CSS+DIV或元素ID
- 全国软考——软件评测师有感
- 2019-11软考报名网站汇总,陆续更新
- Android涉及到的设计模式
- 词性标记:VA,VC,VE,VV等
- 2021年全球起酥油收入大约4171.6百万美元,预计2028年达到5052.7百万美元,2022至2028期间,年复合增长率CAGR为 2.8%