一、查

设置 Author表  在 views文件中

# 作者表
class Author(models.Model):
id =models.AutoField(primary_key=True)
name= models.CharField(max_length=32,null=False,unique=True)
#告诉ORM 我这张表和book是多对多的对应关系,orm自动帮我生成第三张表
book= models.ManyToManyField(to='Book')

  

生成表在mysql中

D:\mysite>python3 manage.py makemigrations
D:\mysite>python3 manage.py migrate

二、增

静态页面 Author_add.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加作者信息</title>
</head>
<body>
<h1>添加作者</h1>
<form action="/Author_add/" method='post'>
<p>
作者姓名:<input type="text" name='author_name'>
</p>
<p>
<select multiple name="books">
{% for book in book_list %}
<option value="{{ book.id }}">{{ book.title }}</option>
{% endfor %} </select>
</p>
<p>
<input type="submit" value="提交">
</p>
</form>
</body>
</html>
from app01 import views

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Publisher_list/',views.Publisher_list),
url(r'^Publisher_add/',views.Publisher_add),
url(r'^Publisher_del/',views.Publisher_del),
url(r'^Publisher_edit/',views.Publisher_edit),
url(r'^Author_list/',views.Author_list),
url(r'^Author_add/',views.Author_add)

定义函数

def Author_add(request):
if request.method =='POST':
#获取前端表单作者姓名的变量:
new_author_name =request.POST.get('author_name')
# 获取前端表单多选框的书名
books = request.POST.getlist('books')
#获取在数据库中添加新的作者名的对象 name为mysql表中的字段
new_author_obj = models.Author.objects.create(name =new_author_name)
#获取相关书的信息
new_author_obj.book.set(books)
print(11111)
return redirect('/Author_list/')
ret =models.Book.objects.all()
print(ret)
print(ret[0])
print(ret[0].title)
return render(request,'author_add.html',{'book_list':ret})

  提交页面

 三、删除

urls

from app01 import views

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Publisher_list/',views.Publisher_list),
url(r'^Publisher_add/',views.Publisher_add),
url(r'^Publisher_del/',views.Publisher_del),
url(r'^Publisher_edit/',views.Publisher_edit),
url(r'^Author_list/',views.Author_list),
url(r'^Author_add/',views.Author_add),
url(r'^Author_del/',views.Author_del)

  

定义的函数在views里

def Author_del(request):
del_id =request.GET.get('id')
models.Author.objects.get(id =del_id).delete()
return redirect('/Author_list/')

在静态网页中添加(修改Author_list.html文件)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Author_list</title>
</head>
<body>
<table BORDER="">
<thead>
<tr>
<td>#</td>
<td>ID</td>
<td>名字</td>
<td>作品</td>
<td>操作</td>
</tr>
</thead>
<tbody>
{% for author in author_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ author.id }}</td>
<td>{{ author.name }}</td>
<td>
{% for book in author.book.all %}
{{ book.tile }}
{% endfor %}
</td>
<td>
<a href="/Author_del/?id={{ author.id }}">删除</a>
</td>
</tr>
{% endfor %}
<a href="/Author_add/">添加新的作者</a>
</tbody>
</table>
</body>
</html>

  

 四、编辑

author_edit.html 页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>编辑页面</title>
</head>
<body>
<h1>此页面为编辑页面</h1>
<form action="/Author_edit/" method="post">
<p>
<input type="hidden" name='author_id' value="{{ author.id }}">
</p>
<p>
<input type="text" name='author_name' value="{{ author.name }}">
</p>
<p>
<select multiple name="books">
{% for foo in book %}
<option value="{{ foo.id }}">{{ foo.title }}</option>
{% endfor %}
</select>
</p>
<p>
<input type="submit" value="提交">
</p>
</form>
</body>
</html>

views里的函数

def Author_edit(request):
if request.method=='POST':
author_id =request.POST.get('author_id')
author_name = request.POST.get('author_name')
books_author =request.POST.getlist('books') author_obj= models.Author.objects.get(id =author_id)
author_obj.name =author_name
author_obj.book.set(books_author)
author_obj.save()
return redirect('/Author_list/')
print()
edit_id =request.GET.get('id')
edit_id_obj =models.Author.objects.get(id =edit_id)
print()
ret_obj =models.Book.objects.all()
print(ret_obj)
return render(request,'author_edit.html',{'book':ret_obj,'author':edit_id_obj})

老师写的views文件

# 编辑作者
def edit_author(request): # 如果编辑完提交数据过来
if request.method == "POST":
# 拿到提交过来的编辑后的数据
edit_author_id = request.POST.get("author_id")
new_author_name = request.POST.get("author_name")
# 拿到编辑后作者关联的书籍信息
new_books = request.POST.getlist("books")
# 根据ID找到当前编辑的作者对象
edit_author_obj = models.Author.objects.get(id=edit_author_id)
# 更新作者的名字
edit_author_obj.name = new_author_name
# 更新作者关联的书的对应关系
edit_author_obj.book.set(new_books)
# 将修改提交到数据库
edit_author_obj.save()
# 返回作者列表页,查看是否编辑成功
return redirect("/author_list/") # 从URL里面取要编辑的作者的id信息
edit_id = request.GET.get("id")
# 找到要编辑的作者对象
edit_author_obj = models.Author.objects.get(id=edit_id) # 查询所有的书籍对象
ret = models.Book.objects.all() return render(request, "edit_author.html", {"book_list": ret, "author": edit_author_obj})

  

day 64 Django 第五天 多表对多表的对应关系ORM的更多相关文章

  1. Django基础五之django模型层(二)多表操作

    一 创建模型 表和表之间的关系 一对一.多对一.多对多 ,用book表和publish表自己来想想关系,想想里面的操作,加外键约束和不加外键约束的区别,一对一的外键约束是在一对多的约束上加上唯一约束. ...

  2. 06.Django基础五之django模型层(二)多表操作

    一 创建模型 表和表之间的关系 一对一.多对一.多对多 ,用book表和publish表自己来想想关系,想想里面的操作,加外键约束和不加外键约束的区别,一对一的外键约束是在一对多的约束上加上唯一约束. ...

  3. day 70 Django基础五之django模型层(二)多表操作

    Django基础五之django模型层(二)多表操作   本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...

  4. day 56 Django基础五之django模型层(二)多表操作

    Django基础五之django模型层(二)多表操作   本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...

  5. 第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表、课程机构表、讲师表

    第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表.课程机构表.讲师表 创建名称为app_organization的课 ...

  6. Django基础五之django模型层(一)单表操作

    一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...

  7. 05.Django基础五之django模型层(一)单表操作

    一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...

  8. day 69 Django基础五之django模型层(一)单表操作

    Django基础五之django模型层(一)单表操作   本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现 ...

  9. day 55 Django基础五之django模型层(一)单表操作

      Django基础五之django模型层(一)单表操作   本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它 ...

随机推荐

  1. Spring框架之Bean的作用范围和生命周期的注解

    1. Bean的作用范围注解 * 注解为@Scope(value="prototype"),作用在类上.值如下: * singleton -- 单例,默认值 * prototype ...

  2. 设计模式之java源码-工厂方法模式

    工厂方法模式 8.1 女娲造人的故事 东汉<风俗通>记录了一则神话故事:“开天辟辟,未有人民,女娲搏,黄土作人……”,讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有 ...

  3. maven使用感受

    第一次接触的时候,什么都不懂,感觉好复杂. 后来系统地看了一个使用教程: 简单评价一下: 自动帮我们下载jar架包,还有就是可以执行命令自己部署到远程服务器上面去. 缺点: 学习成本.一般人不了解.第 ...

  4. CentOS 6.5 搭建cuda环境

    首先这一篇文章是我搞了N多天后,才成功一点经验,为了不至于下次搭建时忘记,所以记录下来.nivida官网有一个文档,大家可以下载看一下 https://developer.nvidia.com/cud ...

  5. 20155317 王新玮 2016-2017-2 《Java程序设计》第9周学习总结

    20155317 王新玮 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以 ...

  6. foreach循环赋值问题

    foreach ($list as $key=>$val){ $data=array();//这一个一定要加上不然循环后,modify_one,modify_two都会赋值 if ($val[' ...

  7. Navicat如何导出数据库的svg、pdf,png图片

    有时候各位可能有这么一种感觉,如果一个数据库中的表太多的话,查看起来不大方便,如果你习惯用navicat软件来查看er图的话,那也是更困难了,这里介绍一种方法,就是把这些关系结构导出一个可以用浏览器打 ...

  8. post异步请求

    //创建url NSURL *url = [[NSURL alloc] initWithString:@"http://api.hudong.com/iphonexml.do"]; ...

  9. C#-派生类

    VS派生类 继承.派生类 class AClass : FClass 构建函数继承 public classname (string astring): base(astring){};默认不继承基类 ...

  10. MySQL性能调优与架构设计——第 15 章 可扩展性设计之Cache与Search的利用

    第 15 章 可扩展性设计之Cache与Search的利用 前言: 前面章节部分所分析的可扩展架构方案,基本上都是围绕在数据库自身来进行的,这样是否会使我们在寻求扩展性之路的思维受到“禁锢”,无法更为 ...