Django入門案例:圖書管理系統

Python實戰社羣

Java實戰社羣

長按識別下方二維碼,按需求添加

掃碼關注添加客服

進Python社羣▲

掃碼關注添加客服

進Java社羣

作者丨小小明

來源丨快學Python

無需寫sql,不需寫前端,利用Django自帶的Admin和ORM框架就能輕鬆實現一個多對多表關係的增刪改查。

開發流程

版本

Django 3.1.1

python 3.6.12

(django) E:\python_Projects\django_demo>pip show django
Name: Django
Version: 3.1.1
Summary: A high-level Python Web framework that encourages rapid development and clean, pragmatic design.
Home-page: https://www.djangoproject.com/
Author: Django Software Foundation
Author-email: [email protected]
License: BSD-3-Clause
Location: d:\anaconda3\envs\django\lib\site-packages
Requires: pytz, asgiref, sqlparse
Required-by:

(django) E:\python_Projects\django_demo>python -V
Python 3.6.12 :: Anaconda, Inc.

django安裝:

pip install Django -i https://pypi.tuna.tsinghua.edu.cn/simple

-i https://pypi.tuna.tsinghua.edu.cn/simple 指定清華鏡像源,下載速度更快。

指定 Django 的下載版本(3.1.1 可以改成你要的版本):

pip install Django==3.1.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

創建項目和APP

django-admin startproject booktest
cd booktest
django-admin startapp book_managerment

帶路徑演示:

(django) E:\python_Projects\django_demo>django-admin startproject booktest
(django) E:\python_Projects\django_demo>cd booktest
(django) E:\python_Projects\django_demo\booktest>django-admin startapp book_managerment

操作後目錄結構:

安裝應用

在 booktest\booktest\settings.py 中找到INSTALLED_APPS這一項,修改爲:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'book_managerment'
]

設計模型

表結構:

書籍表 Book:title 、 price 、 pub_date 、 publish(外鍵,多對一) 、 authors(多對多)

出版社表 Publish:name 、 city 、 email

作者表 Author:name 、 age 、 au_detail、gender 、 tel 、 addr 、 birthday

以下是表格關聯說明:

修改booktest\book_managerment\models.py,定義模型類如下:

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.SmallIntegerField()
    gender_choices = (
        (0, "女"),
        (1, "男"),
        (2, "保密"),
    )
    gender = models.SmallIntegerField(choices=gender_choices)
    tel = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)
    birthday = models.DateField()


class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    pub_date = models.DateField()
    publish = models.ForeignKey("Publish", on_delete=models.CASCADE)
    authors = models.ManyToManyField("Author")


class Publish(models.Model):
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=64)
    email = models.EmailField()

生成本地數據庫文件

  • 生成遷移文件:根據模型類生成創建表的語句

  • 執行遷移:根據第一步生成的語句在數據庫中創建表

python manage.py makemigrations
python manage.py migrate

執行後生成的文件:

插入初始數據

使用DataSource打開db.sqlite3文件後,執行以下sql語句:

insert into book_managerment_publish(id, name, city, email)
values (1, "華山出版社", "華山", "[email protected]"),
       (2, "明教出版社", "黑木崖", "[email protected]");

insert into book_managerment_author(id, name, age, gender, tel, addr, birthday)
values (1, "令狐沖", 25, 1, 13432335433, "華山", "1994-5-23"),
       (2, "任我行", 58, 1, 13943454554, "黑木崖", "1961-8-13"),
       (3, "任盈盈", 23, 0, 13878934322, "黑木崖", "1996-5-20");

INSERT INTO book_managerment_book(id, title, price, pub_date, publish_id)
VALUES (1, "獨孤九劍", 200, "2019-1-7", 1),
       (2, "吸星大法", 180, "2019-1-7", 2),
       (3, "葵花寶典", 280, "2019-3-15", 2);

INSERT INTO book_managerment_book_authors(id, book_id, author_id)
VALUES (1, 1, 1),
       (2, 1, 2),
       (3, 2, 2);

後臺管理

管理界面本地化:

  • 將顯示的語言、時間等使用本地的習慣,這裏的本地化就是進行中國化,中國大陸地區使用簡體中文,時區使用亞洲/上海時區,注意這裏不使用北京時區表示

  • 打開booktest/booktest/settings.py文件,找到語言編碼、時區的設置項,將內容改爲如下:

LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'

創建管理員:

python manage.py createsuperuser

(我設置用戶名密碼均爲admin)

(django) E:\python_Projects\django_demo\booktest>python manage.py createsuperuser
用戶名 (leave blank to use 'think'): admin
電子郵件地址:
Password:
Password (again):
密碼跟 用戶名 太相似了。
密碼長度太短。密碼必須包含至少 8 個字符。
這個密碼太常見了。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

註冊模型類

打開booktest\booktest\admin.py文件,編寫如下代碼

from django.contrib import admin
from .models import *


class BookModal(admin.StackedInline):
    model = Book


@admin.register(Publish)
class PublishAdmin(admin.ModelAdmin):
    inlines = [BookModal]
    list_display = ('id', 'name', 'city', 'email', 'books')
    fields = ('name', 'city', 'email')
    list_filter = ['city']
    search_fields = ['name', 'city']

    def books(self, obj):
        return [book.title for book in obj.book_set.all()]


@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'price', 'pub_date', "publish_name", "author")
    fields = ('title', 'price', 'pub_date', "authors")
    search_fields = ['title', 'price', 'pub_date']

    def author(self, obj):
        return [author.name for author in obj.authors.all()]

    def publish_name(self, obj):
        return obj.publish.name

    filter_horizontal = ('authors',)


@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'age', 'gender', 'tel', 'addr', 'birthday', 'books')
    fields = ('name', 'age', 'gender', 'tel', 'addr', 'birthday')
    list_filter = ['gender']
    search_fields = ['name', 'age', 'gender', 'tel', 'addr', 'birthday']

    def books(self, obj):
        return [book.title for book in obj.book_set.all()]

自定義管理頁模板

修改booktest/booktest/settings.py中的TEMPLATES的DIRS爲指定的路徑:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [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',
            ],
        },
    },
]

創建目錄booktest/templates/admin,將python安裝路徑下的Lib\site-packages\django\contrib\admin\templates\admin下的base_site.html文件拷貝到該目錄下並修改:

修改爲如下內容:

{% extends "admin/base.html" %}

{% block title %}圖書後臺管理系統{% endblock %}

{% block branding %}
    <h1 id="site-name"><a href="{% url 'admin:index' %}">圖書後臺管理系統</a></h1>
{% endblock %}

{% block nav-global %}{% endblock %}

啓動項目

執行一下命令後:

python manage.py runserver

打開http://127.0.0.1:8000/admin

操作演示

查詢所有作者所寫的書:

查詢每本書所屬的出版社和作者:

查詢每個出版社所出的書:

修改作者信息:

修改書籍信息,可管理所歸屬的作者:

修改出版社信息,可管理所出版的每本書:

支持搜索和過濾:

程序員專欄 掃碼關注填加客服 長按識別下方二維碼進羣


近期精彩內容推薦:  

 再見,戴威!再見,小黃車!

 別瞎學了,這幾門語言要被淘汰了!

 再見 Win10!下一代操作系統來了。。

 牆裂建議收藏,100道Python練手題目


在看點這裏好文分享給更多人↓↓

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章