老男孩python全栈就业班第9期第3部分Django基础第63天建book表及展示书籍列表

建book表及展示书籍列表

1.进入目录 mysiteday62/app01,修改文件 models.py,添加书表类 book

from django.db import models

# Create your models here.

# 图书管理系统,书 作者 出版社
# 出版社
class Publisher(models.Model):
    # 自增的 ID 主键
    id = models.AutoField(primary_key=True)
    # 创建一个 varchar(64) 的唯一的不为空的字段
    name = models.CharField(max_length=64, null=False, unique=True)

# 书
class Book(models.Model):
    id = models.AutoField(primary_key=True)  # 自增的ID主键
    # 创建一个varchar(64)的唯一的不为空的字段
    title = models.CharField(max_length=64, null=False, unique=True)
    # 和出版社关联的外键字段,Django2.x 必须加上 on_delete
    publisher_id = models.ForeignKey(to="Publisher", on_delete=models.CASCADE)

2.打开pycharm的 Tools 下的 "Run manage.py Task...",快速运行生成表,不用写 python manage.py,输入 makemigrations 命令执行结束后,再输入 migrate 命令执行,最后在数据库中生成表 app01_book

3.ForeignKey会自动在属性后面加_id,进入目录 mysiteday62/app01,修改文件 models.py,把 Book类中的 publisher_id 改成 publisher

4.改完之后,重新运行命令

5.在表 book 中添加数据

6.进入目录 mysiteday62/mysiteday62,修改文件 urls.py,添加 path,新增 book_list 路径

from django.contrib import admin
from django.urls import path

from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),

    # 出版社相关的对应关系
    path('publisher_list/', views.publisher_list),
    path('add_publisher/', views.add_publisher),
    path('delete_publisher/', views.delete_publisher),
    path('edit_publisher/', views.edit_publisher),

    # 书相关的对应关系
    path('book_list/', views.book_list),

    # 测试
    path('test/', views.test),
]

7.进入目录 mysiteday62/mysiteday62,修改文件 views.py,添加方法 book_list

from django.shortcuts import HttpResponse, render, redirect
from app01 import models

# Create your views here.

# 展示出版社列表
def publisher_list(request):
    # 去数据库查出所有的出版社,填充到HTML中,给用户返回
    ret = models.Publisher.objects.all().order_by("id")
    return render(request, "publisher_list.html", {"publisher_list":ret})

# 添加新的出版社
def add_publisher(request):
    error_msg = ""
    # 如果是POST请求,我就取到用户的数据
    if request.method == "POST":
        new_name = request.POST.get("publisher_name")
        if new_name:
            # 通过ORM去数据库新建一条记录
            models.Publisher.objects.create(name=new_name)
            # 引导用户访问出版社列表,查看是否添加成功,跳转
            return redirect("/publisher_list/")
        else:
            error_msg = "出版社名字不能为空!"
    # 用户第一次来,我给他返回一个用来填写的 HTML 页面
    return render(request, "add_publisher.html", {{"error":error_msg}})

# 删除出版社
def delete_publisher(request):

    # 删除指定的数据
    # 1.从GET请求的参数里面拿到将要删除的数据的ID值
    del_id = request.GET.get("id", None)
    if del_id:
        # 去数据库删除当前id值的数据
        # 根据id值查找当前数据
        del_obj = models.Publisher.objects.get(id=del_id)
        # 删除
        del_obj.delete()
        # 返回删除后的页面,跳转到出版社的列表页,查看删除是否成功
        return redirect("/publisher_list/")
    else:
        return HttpResponse("要删除的数据不存在!")

# 编辑出版社
def edit_publisher(request):
    error_msg = ""
    # 用户修改完出版社的名字,点击提交按钮,给我发来新的出版社名字
    if request.method == "POST":
        # 取新出版社名字
        edit_id = request.POST.get("id")
        new_name = request.POST.get("publisher_name")
        # 更新出版社
        # 根据id取到编辑的是哪个出版社
        edit_publisher = models.Publisher.objects.get(id=edit_id)
        edit_publisher.name = new_name
        edit_publisher.save()  # 把修改提交到数据库
        # 跳转出版社列表页,查看是否修改成功
        return redirect("/publisher_list/")

        
    # 从GET请求的URL中取到id参数
    edit_id = request.GET.get("id")
    if edit_id:
        # 获取到当前编辑的出版社对象
        publisher_obj  = models.Publisher.objects.get(id=edit_id)
        return render(request, "edit_publisher.html", {"publisher":publisher_obj})
    else:
        return HttpResponse("编辑的出版社不存在!")

# 展示书的列表
def book_list(request):
    # 去数据库中查询所有的书籍
    all_book = models.Book.objects.all()
    # 在 HTML 页面完成字符串替换(渲染数据)
    return render(request, "book_list.html", {"all_book":all_book})

def test(request):
    print(request.GET)
    print(request.GET.get("id"))
    return HttpResponse('OK')

8.进入目录 mysiteday62/templates,添加文件 book_list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>书籍列表</title>
</head>
<body>
<h1>所有的书籍都在这里!</h1>
<table border="1">
    <thead>
        <tr>
            <td>id</td>
            <td>title</td>
            <td>publisher</td>
        </tr>
    </thead>
    <tbody>
    {% for i in all_book %}
        <tr>
            <td>{{ i.id }}</td>
            <td>{{ i.title }}</td>
            <td>{{ i.publisher }}</td>
        </tr>
    {% endfor %}
    </tbody>
</table>
</body>
</html>

9.测试

10.publisher 显示的是一个 object,进入目录 mysiteday62/templates,修改文件 book_list.html,把 i.publisher 改成 i.publisher.name

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>书籍列表</title>
</head>
<body>
<h1>所有的书籍都在这里!</h1>
<table border="1">
    <thead>
        <tr>
            <td>id</td>
            <td>title</td>
            <td>publisher</td>
        </tr>
    </thead>
    <tbody>
    {% for i in all_book %}
        <tr>
            <td>{{ i.id }}</td>
            <td>{{ i.title }}</td>
            <td>{{ i.publisher.name }}</td>
        </tr>
    {% endfor %}
    </tbody>
</table>
</body>
</html>

11.测试

 

posted on 2019-11-16 10:38  herisson_pan  阅读(19)  评论(0)    收藏  举报

导航