隐藏页面特效

图书管理系统进阶---多表操作

1|0models.py模型类


Book模型类下面写一个获取所有作者的函数 class Book(models.Model): ..... def get_all_author(self): # name_list = [] # for author in self.authors.all(): # name_list.append(author.name) # name_list_srt = '+'.join(name_list) # return name_list_srt return ','.join([author.name for author in self.authors.all()])

2|0book_list.html 展示页面


{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> </head> <body> <div class="container"> <h1>书籍展示</h1> <div class="row"> <div class="col-md-8 col-md-offset-2"> <a href="{% url 'add' %}" class="btn btn-primary">添加书籍</a> <table style="margin-top: 10px;" class="table table-hover table-striped table-bordered"> <thead> <tr> <th>序号</th> <th>书名</th> <th>价钱</th> <th>出版日期</th> <th>出版社</th> <th>作者</th> <th>操作</th> </tr> </thead> <tbody> {% for book_obj in book_obj_list %} <tr> <td>{{ forloop.counter }}</td> <td>{{ book_obj.title }}</td> <td>{{ book_obj.price }}</td> <td>{{ book_obj.pub_date|date:'Y-m-d' }}</td> <td>{{ book_obj.pub.name }}</td> <td> {{ book_obj.get_all_author }} //两种方法都可以,上面这种是在Book模型类下面写了一个函数,然后直接调用就行了,下面这种是用后台传过来的book类对象操作第三张表for循环 </td> {# <td>#} {# {% for author in book_obj.authors.all %}#} {# {{ author.name }}#} {# {% if forloop.last %}#} {##} {# {% else %}#} {# ,#} {# {% endif %}#} {##} {# {% endfor %}#} {# </td>#} <td> <a href="{% url 'edit' book_obj.pk %}" class="btn btn-warning">编辑</a> <a href="{% url 'delete_book' book_obj.pk %}" class="btn btn-danger">删除</a> </td> </tr> {% endfor %} </tbody> </table> </div> </div> </div> </body> </html>

3|0add.html添加书籍


{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> </head> <body> <div class="container"> <h1>添加书籍</h1> <div class="row"> <div class="col-md-8 col-md-offset-2"> <form action="{% url 'add' %}" method="post"> {# <form action="{% url 'add_book' %}" method="post">#} {# <form action="{% url 'add_book' 2020 %}" method="post">#} <div class="form-group"> <label for="title">书籍名称</label> <input type="text" class="form-control" id="title" placeholder="书籍名称" name="title"> </div> <div class="form-group"> <label for="price">价格</label> <input type="text" class="form-control" id="price" placeholder="书籍名称" name="price"> </div> <div class="form-group"> <label for="pub_date">出版日期</label> <input type="date" class="form-control" id="pub_date" placeholder="书籍名称" name="pub_date"> </div> <div class="form-group"> <label for="publish">出版社</label> <select name="pub_id" id="publish" class="form-control"> {% for publish in publish_list %} <option value="{{ publish.id }}">{{ publish.name }}</option> {% endfor %} </select> </div> <div class="form-group"> <label for="authors">作者</label> <select multiple name="authors" id="authors" class="form-control"> {% for author in author_list %} <option value="{{ author.id }}">{{ author.name }}</option> {% endfor %} </select> </div> <button class="btn btn-success pull-right">提交</button> </form> </div> </div> </div> </body> </html>

4|0edit.html 编辑


{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> </head> <body> <div class="container"> <h1>编辑书籍</h1> <div class="row"> <div class="col-md-8 col-md-offset-2"> <form action="{% url 'edit' old_book_obj.pk %}" method="post"> {# <form action="{% url 'add_book' %}" method="post">#} {# <form action="{% url 'add_book' 2020 %}" method="post">#} <div class="form-group"> <label for="title">书籍名称</label> <input type="text" class="form-control" id="title" placeholder="书籍名称" name="title" value="{{ old_book_obj.title }}"> </div> <div class="form-group"> <label for="price">价格</label> <input type="text" class="form-control" id="price" placeholder="书籍名称" name="price" value="{{ old_book_obj.price }}"> </div> <div class="form-group"> <label for="pub_date">出版日期</label> <input type="date" class="form-control" id="pub_date" placeholder="书籍名称" name="pub_date" value="{{ old_book_obj.pub_date|date:'Y-m-d' }}"> </div> <div class="form-group"> <label for="publish">出版社</label> <select name="pub_id" id="publish" class="form-control"> {% for publish in publish_list %} {% if old_book_obj.pub == publish %} <option value="{{ publish.id }}" selected>{{ publish.name }}</option> {% else %} <option value="{{ publish.id }}">{{ publish.name }}</option> {% endif %} {% endfor %} </select> </div> <div class="form-group"> <label for="authors">作者</label> <select multiple name="authors" id="authors" class="form-control"> {% for author in author_list %} {% if author in old_book_obj.authors.all %} <option value="{{ author.id }}" selected>{{ author.name }}</option> {% else %} <option value="{{ author.id }}" >{{ author.name }}</option> {% endif %} {% endfor %} </select> </div> <button class="btn btn-success pull-right">提交</button> </form> </div> </div> </div> </body> </html>

5|0urls.py文件


from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^book_list/', views.book_list, name='book_list'), url(r'^add/', views.AddEdit.as_view(), name='add'), url(r'^edit/(\d+)/', views.AddEdit.as_view(), name='edit'), url(r'^delete_book/(\d+)/', views.delete_book, name='delete_book'), url(r'^xx/', views.xx, name='xx'), ]

6|0views.py文件


from django.shortcuts import HttpResponse, render, redirect from app01 import models from django.views import View #展示 def book_list(request): book_obj_list = models.Book.objects.all() return render(request,'book_list.html',{'book_obj_list':book_obj_list}) #添加 class Add(View): def get(self,request): publish_list = models.Publish.objects.all() author_list = models.Author.objects.all() return render(request,'add.html',{'publish_list': publish_list, 'author_list': author_list}) def post(self,request): #querydict类型都是不可变的,想修改,可用下面两种方式 #request.POST._mutable = True #方法一,让querydict可变 data = request.POST.copy() #第二种方法 xx = data.pop('authors') book_obj = models.Book.objects.create( **data.dict(), ) #添加这本书和作者的多对多关系 book_obj.authors.add(*xx) return redirect('book_list') #编辑 class Edit(View): def get(self,request,pk): old_book_obj = models.Book.objects.get(pk=pk) publish_list = models.Publish.objects.all() author_list = models.Author.objects.all() return render(request,'edit.html',{'old_book_obj': old_book_obj,'publish_list': publish_list,'author_list': author_list}) def post(self,request,pk): old_book_obj = models.Book.objects.filter(pk=pk) authors_id_list = request.POST.getlist('authors') data = request.POST.dict() data.pop('authors') old_book_obj.update( **data ) old_book_obj.first().authors.set(authors_id_list) return redirect('book_list') #删除 def delete_book(request,pk): models.Book.objects.filter(pk=pk).delete() return redirect('book_list')

7|0进阶优化代码,合并添加和编辑


class AddEdit(View): def get(self,request,pk=None): old_books = models.Book.objects.filter(pk=pk) publish_list = models.Publish.objects.all() author_list = models.Author.objects.all() if old_books.exists(): old_book_obj = old_books.first() return render(request,'add_edit.html',{'old_book_obj': old_book_obj,'publish_list': publish_list,'author_list': author_list}) else: return render(request,'add_edit.html', {'publish_list': publish_list, 'author_list': author_list}) def post(self,request,pk=None): old_book_obj = models.Book.objects.filter(pk=pk) authors_id_list = request.POST.getlist('authors') data = request.POST.dict() data.pop('authors') if old_book_obj.exists(): old_book_obj.update( **data ) old_book_obj.first().authors.set(authors_id_list) else: book_obj = models.Book.objects.create( **data ) #添加这本书和作者的多对多关系 book_obj.authors.add(*authors_id_list) return redirect('book_list')

__EOF__

本文作者404 Not Found
本文链接https://www.cnblogs.com/weiweivip666/p/13379062.html
关于博主:可能又在睡觉
版权声明:转载请注明出处
声援博主:如果看到我睡觉请喊我去学习
posted @   我在路上回头看  阅读(202)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示