zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    偶串_牛客网
    制造回文_牛客网
    字典树(前缀树)的实现
    动态规划LeetCode174地下城游戏
    动态规划LeetCode64最小路径和
    动态规划LeetCode300最长上升子序列
    动态规划LeetCode120三角形最小路径和
    Zabbix 监控sqlserver
    如何回收VCSA 6自带的vPostgres数据库空间
    领益科技:导出Wireless组中的成员
  • 原文地址:https://www.cnblogs.com/newway644617704/p/12768271.html
Copyright © 2011-2022 走看看