ORM多表操作练习2(代码优化)


 

 orm_lx2_optimize.__init__.py

import pymysql

pymysql.install_as_MySQLdb()

orm_lx2_optimize.settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',  # app01应用注册
]


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '20211204',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '123456'
    }
}


STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "statics"),
]

orm_lx2_optimize.urls.py

from django.contrib import admin
from django.urls import path, include
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path("check/", views.check),
    path("delete//", views.delete),
    path("add/", views.add),
    path("edit//", views.edit),
]

app01.models.py

class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    gender = models.CharField(max_length=32)
    birthday = models.DateField()


class Publish(models.Model):
    id = models.AutoField(primary_key=True)
    pub_name = models.CharField(max_length=32)
    pub_city = models.CharField(max_length=32)
    pub_email = models.EmailField()


class Book(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    pub_date = models.DateField()

    publish = models.ForeignKey(to="Publish", to_field="id", on_delete=models.CASCADE)

    authors = models.ManyToManyField(to="Author")


# 作者和出版社表,需自行手动添加几条数据

app01.views.py

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

# Create your views here.


def check(request):
    book_obj = Book.objects.filter().all()
    return render(request, "check.html", locals())


def delete(request, number):
    Book.objects.filter(id=number).delete()
    return redirect("http://127.0.0.1:8000/check/")


def add(request):
    if request.method == "GET":
        publish_list = Publish.objects.filter().all()
        author_list = Author.objects.filter().all()
        return render(request, "add.html", locals())
    # 先添加Book表的数据信息
    book_obj = Book.objects.create(
        title=request.POST.get("title"),
        price=request.POST.get("price"),
        pub_date=request.POST.get("pub_date"),
        publish_id=request.POST.get("publish"),
    )
    # 获取到选择作者的id的列表
    author_list = request.POST.getlist("author")
    # 多对多的关系绑定
    book_obj.authors.add(*author_list)
    return redirect("http://127.0.0.1:8000/check/")


def edit(request, number):
    book_obj = Book.objects.filter(id=number).first()
    if request.method == 'GET':
        publish_list = Publish.objects.filter().all()
        author_list = Author.objects.filter().all()
        return render(request, "edit.html", locals())
    # 先修改Book表的数据信息
    Book.objects.filter(id=number).update(
        title=request.POST.get("title"),
        price=request.POST.get("price"),
        pub_date=request.POST.get("pub_date"),
        publish_id=request.POST.get("publish"),
    )
    # 获取到修改后作者的id的列表
    author_list = request.POST.getlist("author")
    # 多对多关系的重新设置
    book_obj.authors.set(author_list)
    return redirect("http://127.0.0.1:8000/check/")

templates.check.html

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>查看书籍title>
    <link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.min.css">
    <script src="/static/bootstrap-3.4.1-dist/js/bootstrap.min.js">script>
    <script src="/static/jQuery3.6.js">script>
    <style>
        table {
            margin-top: 70px;
        }
    style>
head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-10 col-md-offset-1">
            <h3>查看书籍h3>
            <button class="btn btn-success pull-right"><a href="http://127.0.0.1:8000/add/">添加书籍a>button>
            <table class="table table-bordered">
                <thead>
                <tr>
                    <th class="text-center">编号th>
                    <th class="text-center">书籍名称th>
                    <th class="text-center">书籍价格(元)th>
                    <th class="text-center">出版日期th>
                    <th class="text-center">出版社th>
                    <th class="text-center">作者th>
                    <th class="text-center">编辑操作th>
                    <th class="text-center">删除操作th>
                tr>
                thead>
                <tbody>
                {# 传过来的是QuerySet对象,直接for循环取到每一个model对象,然后通过.的方式进行取值 #}
                {% for book in book_obj %}
                    <tr class="text-center">
                    <td>{{ forloop.counter }}td>
                    <td>{{ book.title }}td>
                    <td>{{ book.price }}td>
                    <td>{{ book.pub_date|date:'Y-m-d' }}td>
                    <td>{{ book.publish.pub_name }}td>
                    <td>
                        {# 通过连表的正向查询,查到当前书籍的所有作者,返回值是QuerySet对象 #}
                        {% for author in book.authors.all %}
                            {# 如果是最后一个值,那么后面不加',' #}
                            {% if forloop.last %}
                                <span>{{ author.name }}span>
                            {% else %}
                                <span>{{ author.name }},span>
                            {% endif %}
                        {% endfor %}
                    td>
                    <td>
                        <button class="btn btn-sm btn-warning"><a href="http://127.0.0.1:8000/edit/{{ book.id }}/">编辑a>button>
                    td>
                    <td>
                        <button class="btn btn-sm btn-danger"><a href="http://127.0.0.1:8000/delete/{{ book.id }}/">删除a>button>
                    td>
                    tr>
                {% endfor %}
                tbody>
            table>
        div>
    div>
div>
body>
html>

templates.add.html

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加书籍title>
    <link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.min.css">
    <script src="/static/bootstrap-3.4.1-dist/js/bootstrap.min.js">script>
    <script src="/static/jQuery3.6.js">script>
head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h3>添加书籍h3>
            <form action="" method="post">
                {% csrf_token %}
                <div class="form-group">
                    <label for="i1">书籍名称label>
                    <input type="text" name="title" id="i1" class="form-control">
                div>
                <div class="form-group">
                    <label for="i2">书籍价格label>
                    <input type="text" name="price" id="i2" class="form-control">
                div>
                <div class="form-group">
                    <label for="i3">出版日期label>
                    <input type="date" name="pub_date" id="i3" class="form-control">
                div>
                <div class="form-group">
                    <label for="i4">出版社label>
                    <select name="publish" id="i4" class="form-control">
                        {# publish_list是一个QuerySet对象,通过for循环取到每一个model对象,然后通过.进行取值 #}
                        {% for publish in publish_list %}
                            <option value="{{ publish.id }}">{{ publish.pub_name }}option>
                        {% endfor %}
                    select>
                div>
                <div class="form-group">
                    <label for="i5">作者label>
                    <select name="author" id="i5" class="form-control" multiple>
                        {# author_list是一个QuerySet对象,通过for循环取到每一个model对象,然后通过.进行取值 #}
                        {% for author in author_list %}
                            <option value="{{ author.id }}">{{ author.name }}option>
                        {% endfor %}
                    select>
                div>
                <input type="submit" class="btn btn-success btn-block">
            form>
        div>
    div>
div>
body>
html>

templates.edit.html

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>编辑书籍title>
    <link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.min.css">
    <script src="/static/bootstrap-3.4.1-dist/js/bootstrap.min.js">script>
    <script src="/static/jQuery3.6.js">script>
head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h3>编辑书籍h3>
            <form action="" method="post">
                {% csrf_token %}
                {# book_obj是一个model对象,可以直接用.进行取值 #}
                <div class="form-group">
                    <label for="i1">书籍名称label>
                    <input type="text" name="title" id="i1" class="form-control" value="{{ book_obj.title }}">
                div>
                <div class="form-group">
                    <label for="i2">书籍价格label>
                    <input type="text" name="price" id="i2" class="form-control" value="{{ book_obj.price }}">
                div>
                <div class="form-group">
                    <label for="i3">出版日期label>
                    <input type="date" name="pub_date" id="i3" class="form-control" value="{{ book_obj.pub_date|date:'Y-m-d' }}">
                div>
                <div class="form-group">
                    <label for="i4">出版社label>
                    <select name="publish" id="i4" class="form-control">
                        {% for publish in publish_list %}
                            {# 如果当前循环的publish对象和book_obj.publish的对象相等,那么就加上selected属性(默认选中) #}
                            {# book_obj.publish取出来的是一个对象,book_obj.publish_id取出来的是具体值 #}
                            {% if publish == book_obj.publish %}
                                <option value="{{ publish.id }}" selected>{{ publish.pub_name }}option>
                            {% else %}
                                <option value="{{ publish.id }}">{{ publish.pub_name }}option>
                            {% endif %}
                        {% endfor %}
                    select>
                div>
                <div class="form-group">
                    <label for="i5">作者label>
                    <select name="author" id="i5" class="form-control" multiple>
                        {% for author in author_list %}
                            {# book_obj.authors.all是连表的正向查询,查出当前书籍的所有作者的对象,结果是QuerySet #}
                            {# 如果循环的author对象在查询结果列表中,那么就加上selected属性 #}
                            {% if author in book_obj.authors.all %}
                                <option value="{{ author.id }}" selected>{{ author.name }}option>
                            {% else %}
                                <option value="{{ author.id }}">{{ author.name }}option>
                            {% endif %}
                        {% endfor %}
                    select>
                div>
                <input type="submit" class="btn btn-block btn-success">
            form>
        div>
    div>
div>
body>
html>