在作者列表页面的操作栏中加上编辑按钮
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>作者列表</title> </head> <body> <h1>作者列表</h1> <table border="1"> <thead> <tr> <th>#</th> <th>id</th> <th>名字</th> <th>书籍</th> <th>操作</th> </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 %} {% if forloop.last %} {{ book.title }} {% else %} {{ book.title }} | {% endif %} {% endfor %} </td> <td> <a href="/del_author/?id={{ author.id }}">删除</a> <a href="/edit_author/?id={{ author.id }}">编辑</a> </td> </tr> {% endfor %} </tbody> </table> <a href="/add_author/">添加书籍</a> </body> </html>
运行结果:
添加 edit_author.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>编辑作者</title> </head> <body> <h1>编辑作者</h1> <form action="/edit_author/" method="post"> <input type="text" name="author_id" value="{{ author.id }}" style="display: none"> <p> 作者姓名:<input type="text" name="author_name" value="{{ author.name }}"> </p> <p> 书籍: <select multiple name="books"> {% for book in book_list %} {% if book in author.book.all %} <option selected value="{{ book.id }}">{{ book.title }}</option> {% else %} <option value="{{ book.id }}">{{ book.title }}</option> {% endif %} {% endfor %} </select> </p> <p> <input type="submit" value="提交"> </p> </form> </body> </html>
解析:
在 urls.py 中添加 edit_author 的对应关系
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ # 出版社 url(r'^publisher_list/', views.publisher_list), url(r'^add_publisher/', views.add_publisher), url(r'^del_publisher/', views.del_publisher), url(r'^edit_publisher/', views.edit_publisher), # 书籍 url(r'^book_list/', views.book_list), url(r'^add_book/', views.add_book), url(r'^del_book/', views.del_book), url(r'^edit_book/', views.edit_book), # 作者 url(r'^author_list/', views.author_list), url(r'^add_author/', views.add_author), url(r'del_author/', views.del_author), url(r'edit_author/', views.edit_author), ]
在 views.py 中添加 edit_author 函数
from django.shortcuts import render, redirect, HttpResponse from app01 import models # 展示出版社列表 def publisher_list(request): pass # 添加新的出版社 def add_publisher(request): pass # 删除出版社 def del_publisher(request): pass # 编辑出版社 def edit_publisher(request): pass # 展示书籍列表 def book_list(request): pass # 添加书籍 def add_book(request): pass # 删除书籍 def del_book(request): pass # 编辑书籍 def edit_book(request): pass # 作者列表 def author_list(request): # 查询所有作者 all_author = models.Author.objects.all() return render(request, "author_list.html", {"author_list": all_author}) # 添加作者 def add_author(request): if request.method == "POST": # 取得提交的数据 new_author_name = request.POST.get("author_name") # 如果提交的数据是多个值的话用 getlist books = request.POST.getlist("books") # 创建作者 new_author_obj = models.Author.objects.create(name=new_author_name) # 把新作者和书籍建立对应关系,自动提交 new_author_obj.book.set(books) # 跳转到作者列表页面,查看是否添加成功 return redirect("/author_list/") # 查询所有的书籍 all_books = models.Book.objects.all() return render(request, "add_author.html", {"book_list": all_books}) # 删除作者 def del_author(request): # 从 url 里提取要删除的作者 id del_id = request.GET.get("id") # 根据 id 删除 author 表和其相关联表的数据 models.Author.objects.get(id=del_id).delete() # 返回作者列表 return redirect("author_list.html") # 编辑作者 def edit_author(request): # 从 post 提交过来的书籍 if request.method == "POST": # 获取提交过来的作者 id 和姓名 edit_author_id = request.POST.get("author_id") new_author_name = request.POST.get("author_name") # 获取提交过来和作者相关联的书籍 new_book = 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_book) # 将修改保存到数据库中 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) # 获取对象书籍对象 all_book_list = models.Book.objects.all() return render(request, "edit_author.html", {"book_list": all_book_list, "author": edit_author_obj})
运行效果:
编辑 John
《Java》和《C》默认是被选择的,将 《Python》也选上
提交后
来数据库中看一下
作者 id 为 1 的关联书籍多了一个 2