31 图书管理系统进阶版
1.首页搭建
2.图书展示
3.添加书籍
4.编辑功能
1.将用户需要编辑的数据主键值发送给后端
2.后端查询出相应的数据对象并返回一个编辑页面
3.在该编辑页面上展示出待编辑对象对应的原始数据
4.用户编辑点击编辑按钮发送数据
5.后端获取并修改相应的数据
5.删除功能
1.将用户想要删除的数据主键值发送给后端
2.后端获取到主键值直接orm删除
urls.py
urlpatterns = [ url(r'^admin/', admin.site.urls), # 首页 url(r'^$', views.home, name='hm'), # 图书展示 url(r'^book_list/', views.book_list, name='bl'), # 图书添加 url(r'^book_add/', views.book_add, name='ba'), # 图书编辑 url(r'^book_edit/(\d+)/', views.book_edit, name='be'), # 图书删除 url(r'^book_delete/(?P\d+)/ ', views.book_delete, name='bd') ]
views.py
from django.shortcuts import render, redirect, HttpResponse, reverse from app01 import models from django.db.models import Q # Create your views here. def home(request): return render(request, 'home.html') def book_list(request): book_queryset = models.Book.objects.all() return render(request, 'book_list.html', locals()) def book_add(request): if request.method == 'POST': # 获取用户上传的图书数据 title = request.POST.get('title') price = request.POST.get('price') publish_time = request.POST.get('publish_time') publish_pk = request.POST.get('publish_pk') authors_pk_list = request.POST.getlist('authors_pk_list') '''涉及到数据的校验 暂时都不考虑 后面有现成的组件可以完成''' book_obj = models.Book.objects.create(title=title, price=price, publish_time=publish_time, publish_id=publish_pk) book_obj.authors.add(*authors_pk_list) # getlist获取到的是列表 而add方法只能传多个参数逗号隔开 所以使用*打散 # _url = reverse('bl') return redirect('bl') """ redirect括号内支持直接写别名 能够自动反向解析 但是该功能也仅仅局限于没有无名有名分组的情况 就需要借助有reverse方法 """ publish_queryset = models.Publish.objects.all() author_queryset = models.Author.objects.all() return render(request, 'book_add.html', locals()) def book_edit(request, edit_id): # 获取用户需要编辑的数据对象 edit_obj = models.Book.objects.filter(pk=edit_id).first() if request.method == 'POST': title = request.POST.get('title') price = request.POST.get('price') publish_time = request.POST.get('publish_time') publish_pk = request.POST.get('publish_pk') authors_pk_list = request.POST.getlist('authors_pk_list') models.Book.objects.filter(pk=edit_id).update(title=title, price=price, publish_time=publish_time, publish_id=publish_pk) edit_obj.authors.set(authors_pk_list) # 也可以使用对象点属性的方式修改 之后点save() # edit_obj.title = title # edit_obj.price = price # ... # edit_obj.save() return redirect('bl') publish_queryset = models.Publish.objects.all() author_queryset = models.Author.objects.all() # 返回一个编辑页面(上面应该提前写好待编辑的数据) return render(request, 'book_edit.html', locals()) def book_delete(request,delete_id): models.Book.objects.filter(pk=delete_id).delete() return redirect('bl')
home.html
"en"> "UTF-8">Title "https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> {% block css %} {% endblock %}class="container-fluid">{% block js %} {% endblock %}class="row">class="col-md-2">class="col-md-10">class="panel panel-primary">class="panel-heading">class="panel-title">BMS
class="panel-body"> {% block content %}class="jumbotron">{% endblock %}亚洲最大的线上图书馆!
FBI warning 啥都有!!!
book_list.html
{% extends 'home.html' %} {% block content %}class="text-center">图书列表
"{% url 'ba' %}" class="btn btn-success">添加书籍
主键 | 书名 | 价格 | 出版日期 | 出版社 | 作者 | 操作 |
---|---|---|---|---|---|---|
{{ book_obj.pk }} | {{ book_obj.title }} | {{ book_obj.price }} | {{ book_obj.publish_time|date:'Y-m-d' }} | {{ book_obj.publish.name }} | {% for author_obj in book_obj.authors.all %} {% if forloop.last %} {{ author_obj.name }} {% else %} {{ author_obj.name }}, {% endif %} {% endfor %} | "{% url 'be' book_obj.pk %}" class="btn btn-primary btn-xs">编辑 "{% url 'bd' book_obj.pk %}" class="btn btn-danger btn-xs">删除 |
book_add.html
{% extends 'home.html' %} {% block content %}{% endblock %}class="text-center">图书添加
book_edit
{% extends 'home.html' %} {% block content %}{% endblock %}class="text-center">图书编辑
ajax二次删除确认
urls
# ajax删除 url(r'^del_book/',views.del_book)
views
def del_book(request): # 判断当前请求是否是ajax请求 # print(request.is_ajax()) if request.is_ajax(): if request.method == 'POST': delete_id = request.POST.get('delete_id') models.Book.objects.filter(pk=delete_id).delete() return HttpResponse("已经删了 你可以跑路了")
book_list
编辑
删除
{% block js %}
# 普通版本(使用原生js方法)
window.location.reload() // 刷新页面()
$this.parent().parent().remove() // js代码自动刷新
# 进阶版本(使用第三方插件)
复制粘贴加修改
"""ajax的url参数也是支持反向解析的"""
升级版 https://sweetalert.js.org/guides/ 点击下载Bootstrap-sweetalert项目
上面这个二次确认的动态框样式,你也可以直接应用到你的项目中
提醒事项:
1.上述的样式类部分渲染的样式来自于bootstrap中,所有建议在使用上述样式时,将bootstrap的js和css也导入了,这样的情况下,页面效果就不会有任何问题
2.弹出的上述模态框中,可能字体会被图标掩盖一部分,可通过调整字体的上外边距来解决