Django使用ORM之一对多(三)

上篇随笔讲了Django使用ORM之单表操作实现出版社的增删查改。

由于出版社和书籍之间是一对多的关系,那么怎么实现一对多的ORM操作数据库增删查改呢。

1、首先在models.py中创建BookInfo类

1 class Book(models.Model):
2     id = models.AutoField(primary_key=True)  # 自增的ID主键
3     # 创建一个varchar(64)的唯一的不为空的字段
4     title = models.CharField(max_length=64, null=False, unique=True)
5     # 和出版社关联的外键字段
6     publisher = models.ForeignKey(to="Publisher")
7 
8     def __str__(self):
9         return "<Book Object: {}>".format(self.title) 

 2、在urls.py中添加对应关系

1 # 书相关的对应关系
2     url(r'^book_list/', views.book_list),  #展示书籍
3     url(r'^add_book/', views.add_book),  # 添加书籍
4     url(r'^delete_book/', views.delete_book),  # 删除书籍
5     url(r'^edit_book/', views.edit_book),  # 编辑书籍   

3、在views.py中编写对应的方法

 1 def book_list(request):  #展示全部书籍
 2     all_book=models.BoolInfo.objects.all()   #获取全部的书籍集合
 3     return render(request,"Book_List.html",{"all_book":all_book})  #返回Book_List.html页面,并将all_book集合返回到前台页面,返回前台变量名称为all_book
 4 
 5 def add_book(request):  #添加书籍
 6     if request.method=="POST":   #如果页面发过来的为POST请求
 7         #print(request.POST)
 8         book_name=request.POST.get("bname")   #获取新增书籍名称
 9         publisher=request.POST.get("publisher")  #获取新增书籍的出版社
10         models.BoolInfo.objects.create(title=book_name,publisher_id=publisher)   #操作更改数据库
11         return redirect("/book_list/")  #重定向返回到书籍列表页面
12     ret = models.Publisher.objects.all()  #如果不是POST请求,获取全部的出版社信息展示在书籍列表中
13     return render(request,"Add_Book.html",{"publisher":ret})  #返回添加书籍页面,将全部的出版社信息用变量publisher返回到前端页面
14 
15 def delete_book(request):  #删除书籍
16     #print(requst.GET.get("id"))
17     book_id=request.GET.get("id")   #从前台中获取要删除书籍的id
18     if book_id:  #若存在
19         book_obj=models.BoolInfo.objects.get(id=book_id)  #获取要删除的书籍对象
20         book_obj.delete()  #删除
21         return redirect("/book_list/")  #重定向到书籍列表
22     return HttpResponse("要删除的书籍id不存在!")
23 
24 def edit_book(request):  #修改书籍信息
25 
26     if request.method=="POST":   #若传过来为POST请求
27        # print(request.POST)
28         new_bname=request.POST.get("bname")  #获取请求中新的书籍名称
29         book_id=request.POST.get("bid")  #获取新的书籍id
30         new_pid=request.POST.get("publisher")  #获取新的书籍出版社id
31 
32         book_obj=models.BoolInfo.objects.get(id=book_id)  #获取要更改的书籍对象
33         book_obj.title=new_bname    #更改要修改的书籍名称
34         book_obj.publisher_id=new_pid    #更改要修改的出版社id
35         book_obj.save()          #保存更改
36         return redirect("/book_list/")  #重定向到书籍列表页面
37     #print(request.GET)
38     edit_id=request.GET.get("id")  #若传过来的不是POST请求,为GET,获取要编辑书籍对象的ID
39     book_obj=models.BoolInfo.objects.get(id=edit_id)  #获取要编辑的书籍对象
40     ret = models.Publisher.objects.all()    #获取全部编辑出版社信息
41     return render(request,"Edit_Book.html",{"publisher":ret,"edit_book":book_obj})  #返回编辑页面,并将要书籍对象和出版社信息返回到前端页面
42    # return HttpResponse("1")   

 4、编写书籍展示页面

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>书籍列表</title>
 6 </head>
 7 <body>
 8 <h1>所有书籍</h1>
 9 <table border="1">
10     <thead>
11         <tr>
12             <th>书籍id</th>
13             <th>书籍名称</th>
14             <th>出版社名称</th>
15             <th>操作</th>
16         </tr>
17     </thead>
18     <tbody>
19         {% for foo in all_book %}
20             <tr>
21             <th>{{foo.id}}</th>
22             <th>{{foo.title}}</th>
23             <th>{{foo.publisher.name}}</th>
24             <th>
25                 <a href="/delete_book/?id={{ foo.id }}">删除</a>  
26                 <a href="/edit_book/?id={{ foo.id }}">编辑</a>
27             </th>
28             </tr>
29         {% endfor %}
30 
31     </tbody>
32 </table>
33 <a href="/add_book/">添加书籍</a>
34 </body>
35 </html> 

      <a href="/delete_book/?id={{ foo.id }}">删除</a> #url中带有要操作对象的id,根据id操作 

      <a href="/edit_book/?id={{ foo.id }}">编辑</a>

5、编辑新增书籍页面

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>添加书籍</title>
 6 </head>
 7 <body>
 8    <form method="post" action="/add_book/">
 9        <p>
10            书籍名称:<input type="text" name="bname">
11        </p>
12        <p>
13            出版社名称:      <!--根据出版社的全部信息提供选择对话框-->
14            <select name="publisher">
15                {% for foo in publisher %}
16                     <option value="{{foo.id}}">{{ foo.name }}</option>  
17                {% endfor %}
18            </select>
19        </p>
20        <p>
21            <input type="submit" value="提交">
22        </p>
23    </form>
24 </body>
25 </html>

 

posted @ 2020-04-24 16:26  刘老中医写代码  阅读(411)  评论(0编辑  收藏  举报