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 %}




BMS

{% block content %}

亚洲最大图书馆!

应有尽有,经典图书

中外经典名著

{% 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 %} {# #} {% endfor %}
主键 书名 价格 出版日期 出版社 作者 操作
{{ 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 %} 编辑 删除
{% 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

相关