Django入門案例:圖書管理系統
作者:小小明
明鏡本清淨,明鏡亦非臺。
本來無一物,何處惹塵埃!
Django入門案例:圖書管理系統
無需寫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: foundation@djangoproject.com
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, "華山出版社", "華山", "hs@163.com"),
(2, "明教出版社", "黑木崖", "mj@163.com");
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
操作演示
查詢所有作者所寫的書:
查詢每本書所屬的出版社和作者:
查詢每個出版社所出的書:
修改作者資訊:
修改書籍資訊,可管理所歸屬的作者:
修改出版社資訊,可管理所出版的每本書:
支援搜尋和過濾:
相關文章
- Django教程 —— 初步完善圖書管理系統Django
- Django學習筆記《二》圖書管理系統Django筆記
- Django練習-學生管理系統案例Django
- 圖書管理系統2
- 圖書管理系統(小程式)
- 校園圖書管理系統開發-中小學智慧圖書管理系統開發
- Python—簡單圖書管理系統Python
- Django新手圖文入門教程Django
- Django學習筆記《一》圖書管理系統專案掛載到阿里雲Django筆記阿里
- 學舟圖書閱讀管理系統
- 圖書管理系統-專案介紹
- django基礎入門之搭建部落格系統Django
- flask框架圖書管理系統客戶端Flask框架客戶端
- 實驗專案四:圖書管理系統
- Django入門Django
- 圖書系統
- C++圖書館管理系統 [STL實現]C++
- flask框架圖書管理系統伺服器端Flask框架伺服器
- 學舟圖書閱讀管理系統簡介
- Java寫圖書管理系統(四、管理員功能許可權)Java
- 解讀圖書管理系統為書店帶來的好處
- Django 自定義管理命令:從入門到高階Django
- java大作業總結——圖書借閱管理系統Java
- 第一次作業——圖書管理系統
- Rails 實戰——圖書管理系統——基礎建設AI
- Django入門到進階-適合Python小白的系統課程DjangoPython
- 入學管理系統的頂層圖和一層圖
- 23張圖,帶你入門推薦系統
- Django 入門介紹Django
- Java入門自定義異常&模擬借書系統Java
- 圖書館系統(8)
- 專案管理系統全解析:從入門到精通專案管理
- kafka入門案例Kafka
- vuex入門案例Vue
- Python入門(案例)Python
- RabbitMQ入門案例MQ
- Evergreen 3.2.4 和 3.1.10 釋出,開源圖書館管理系統
- python實現一個無介面的小型圖書管理系統Python