day9 图书设计项目
总路由层url
from django.conf.urls import url
from django.contrib import admin
from app01 import views
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='badd'),
# 图书编辑功能
url(r'^book_update/(\d+)/', views.book_update, name='bu'),
# 图书删除功能
url(r'^book_delete/(?P\d+)', views.book_delete, name='bd')
# 使用ajax实现删除功能
url(r'^del_book',views.del_book)
]
首页
def home(request):
return render(request, 'home.html') # 返回一个页面
# home.html
Title
{% block css %}
{% endblock %}
{% block js %}
{% endblock %}
图书展示页
# views.py
def book_list(request):
book_request = models.Book.objects.all()
return render(request, 'book_list.html', locals()) # 把所有的数据展示到页面
# book_list.html
{% extends 'home.html' %} # 用模板的继承
{% block css %}
{% endblock %}
{% block content %}
精选推荐
添加书籍
主键
书名
价格
出版日期
出版社
作者
操作
{% for book_obj in book_request %}
{{ book_obj.id }}
{{ book_obj.title }}
{{ book_obj.price }}
{{ book_obj.publish_time|date:'Y-m-d' }}
{{ book_obj.publish.name }}
{# {{ book_obj.author.all }} #}
{% for author_obj in book_obj.author.all %}
{% if forloop.last %}
{{ author_obj.name }}
{% else %}
{{ author_obj.name }},
{% endif %}
{% endfor %}
编辑
删除
{% endfor %}
{% endblock %}
图书添加功能
# views.py
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')
author_pk = request.POST.getlist('author_pk')
# 向数据库添加数据
book_obj = models.Book.objects.create(title=title, price=price, publish_time=publish_time,publish_id=publish_pk)
book_obj.author.add(*author_pk) # author_pk:获取的是列表,用*打散一个个添加
return redirect('bl')
# 出版社对象
publish_request = models.Publish.objects.all()
# 作者对象
author_request = models.Author.objects.all()
return render(request, 'book_add.html', locals())
# book_add.html
{% extends 'home.html' %}
{% block content %}
图书添加
{% endblock %}
图书编辑功能
# views.py
def book_update(request, update_id):
# 获取用户需要编辑的对象
update_obj = models.Book.objects.filter(pk=update_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')
author_pk = request.POST.getlist('author_pk')
# 向数据库添加数据
models.Book.objects.filter(pk=update_id).update(title=title, price=price, publish_time=publish_time,publish_id=publish_pk)
# 修改第三方表
update_obj.author.set(author_pk)
# 也可以用对象点属性的方式修改,调用save保存
# update_obj.title = title
# update_obj.save()
return redirect('bl')
# 出版社对象
publish_request = models.Publish.objects.all()
# 作者对象
author_request = models.Author.objects.all()
# 返回一个编辑页面
return render(request, 'book_update.html',locals())
# book_update.html
{% extends 'home.html' %}
{% block content %}
图书修改
{% endblock %}
图书删除功能
# views.py
def book_delete(request,delete_id):
# 删除
models.Book.objects.filter(pk=delete_id).delete()
return redirect('bl') # 删除后重定向图书展示页面
使用Ajax实现二次确认删除功能
# 使用ajax就不能使用下面的url,会造成冲突
删除 # 修改前
删除 # 修改后
# // 标签既可以有默认的属性,也可以有自定义的属性,添加delete_id是可以获取主键id值
# views.py
def del_book(request):
# 判断当前请求是否为ajax请求
if request.is_ajax():
if request.method == 'POST': # 判断是否是ajax发来的post请求
# 拿到ajax传到后端的data值
delete_id = request.POST.get('delete_id')
# 根据传过来的主键id删除数据
models.Book.objects.filter(pk=delete_id).delete()
return HttpResponse('删除成功!')
# book_list.html
{% block js %}
{% endblock %}
'''
总结:
1.先在a标签中添加一个自定义属性:delete_id={{book_obj.pk}},并且设置一个c1标签
2.找到c1标签,并且绑定一个点击事件
3.拿当前点击按钮中的delete_id属性
4.做提醒效果
5.判断是否为true
6.真的话:向后端发送ajax请求,并且其中把主键id传入到后端
7.在路由层和视图层开设出相应的函数
8.后端拿到ajax发来的主键id,根据主键id删除数据库数据,并给前端返回一个结果
9.前端拿到返回结果并打印,并刷新页面
'''
# 存在的问题:
window.location.reload()
当有多个页面时,使用上面的方法,会直接刷新到首页,会给用户造成不好的体验
# 解决:
可以根据js代码自动删除,通过代码把tr标签删除
var $this = $(this); // 给this设置一个变量
// js代码自动刷新
$this.parent().parent().remove()
试验url是否可以用反向解析
# 试验url是否可以用反向解析
[02/Dec/2021 16:58:16] "POST /del_book/ HTTP/1.1" 200 15 # 发送了一个post请求,证明是可以的
结合第三方模块实现二次确认删除功能
{% block js %}
{% endblock %}
第三方模块:https://sweetalert.js.org