菜鳥(niǎo)入門!Django入門案例:圖書(shū)管理系統(tǒng)

大家好,我是菜鳥(niǎo)哥!
Web開(kāi)發(fā),也就是寫(xiě)網(wǎng)站,是Django的一大應(yīng)用方向。而Django就是目前最流行的python web框架之一。很多同學(xué)想了解這方面的學(xué)習(xí)案例,今天我們就給大家分享一個(gè):用Django實(shí)現(xiàn)圖書(shū)管理系統(tǒng)
無(wú)需寫(xiě)sql,不需寫(xiě)前端,利用Django自帶的Admin和ORM框架就能輕松實(shí)現(xiàn)一個(gè)多對(duì)多表關(guān)系的增刪改查。
開(kāi)發(fā)流程
版本
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
創(chuàng)建項(xiàng)目和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
操作后目錄結(jié)構(gòu):

安裝應(yīng)用
在 booktest\booktest\settings.py 中找到INSTALLED_APPS這一項(xiàng),修改為:
INSTALLED_APPS?=?[
????'django.contrib.admin',
????'django.contrib.auth',
????'django.contrib.contenttypes',
????'django.contrib.sessions',
????'django.contrib.messages',
????'django.contrib.staticfiles',
????'book_managerment'
]
設(shè)計(jì)模型
表結(jié)構(gòu):
書(shū)籍表 Book:title 、 price 、 pub_date 、 publish(外鍵,多對(duì)一) 、 authors(多對(duì)多)
出版社表 Publish:name 、 city 、 email
作者表 Author:name 、 age 、 au_detail、gender 、 tel 、 addr 、 birthday
以下是表格關(guān)聯(lián)說(shuō)明:

修改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()
生成本地?cái)?shù)據(jù)庫(kù)文件
生成遷移文件:根據(jù)模型類生成創(chuàng)建表的語(yǔ)句 執(zhí)行遷移:根據(jù)第一步生成的語(yǔ)句在數(shù)據(jù)庫(kù)中創(chuàng)建表
python?manage.py?makemigrations
python?manage.py?migrate
執(zhí)行后生成的文件:

插入初始數(shù)據(jù)
使用DataSource打開(kāi)db.sqlite3文件后,執(zhí)行以下sql語(yǔ)句:
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,?"獨(dú)孤九劍",?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);
后臺(tái)管理
管理界面本地化:
將顯示的語(yǔ)言、時(shí)間等使用本地的習(xí)慣,這里的本地化就是進(jìn)行中國(guó)化,中國(guó)大陸地區(qū)使用簡(jiǎn)體中文,時(shí)區(qū)使用亞洲/上海時(shí)區(qū),注意這里不使用北京時(shí)區(qū)表示 打開(kāi)booktest/booktest/settings.py文件,找到語(yǔ)言編碼、時(shí)區(qū)的設(shè)置項(xiàng),將內(nèi)容改為如下:
LANGUAGE_CODE?=?'zh-Hans'
TIME_ZONE?=?'Asia/Shanghai'
創(chuàng)建管理員:
python?manage.py?createsuperuser
(我設(shè)置用戶名密碼均為admin)
(django)?E:\python_Projects\django_demo\booktest>python?manage.py?createsuperuser
用戶名?(leave?blank?to?use?'think'):?admin
電子郵件地址:
Password:
Password?(again):
密碼跟?用戶名?太相似了。
密碼長(zhǎng)度太短。密碼必須包含至少 8 個(gè)字符。
這個(gè)密碼太常見(jiàn)了。
Bypass?password?validation?and?create?user?anyway??[y/N]:?y
Superuser?created?successfully.
注冊(cè)模型類
打開(kāi)booktest\booktest\admin.py文件,編寫(xiě)如下代碼
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()]
自定義管理頁(yè)模板
修改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',
????????????],
????????},
????},
]
創(chuàng)建目錄booktest/templates/admin,將python安裝路徑下的Lib\site-packages\django\contrib\admin\templates\admin下的base_site.html文件拷貝到該目錄下并修改:

修改為如下內(nèi)容:
{%?extends?"admin/base.html"?%}
{%?block?title?%}圖書(shū)后臺(tái)管理系統(tǒng){%?endblock?%}
{%?block?branding?%}
????<h1?id="site-name"><a?href="{%?url?'admin:index'?%}">圖書(shū)后臺(tái)管理系統(tǒng)a>h1>
{%?endblock?%}
{%?block?nav-global?%}{%?endblock?%}
啟動(dòng)項(xiàng)目
執(zhí)行一下命令后:
python?manage.py?runserver
打開(kāi)http://127.0.0.1:8000/admin

操作演示
查詢所有作者所寫(xiě)的書(shū):

查詢每本書(shū)所屬的出版社和作者:

查詢每個(gè)出版社所出的書(shū):

修改作者信息:

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

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

支持搜索和過(guò)濾:


推薦閱讀:
入門:?最全的零基礎(chǔ)學(xué)Python的問(wèn)題? |?零基礎(chǔ)學(xué)了8個(gè)月的Python??|?實(shí)戰(zhàn)項(xiàng)目?|學(xué)Python就是這條捷徑
干貨:爬取豆瓣短評(píng),電影《后來(lái)的我們》?|?38年NBA最佳球員分析?|? ?從萬(wàn)眾期待到口碑撲街!唐探3令人失望? |?笑看新倚天屠龍記?|?燈謎答題王?|用Python做個(gè)海量小姐姐素描圖?|碟中諜這么火,我用機(jī)器學(xué)習(xí)做個(gè)迷你推薦系統(tǒng)電影
趣味:彈球游戲? |?九宮格? |?漂亮的花?|?兩百行Python《天天酷跑》游戲!
AI:?會(huì)做詩(shī)的機(jī)器人?|?給圖片上色?|?預(yù)測(cè)收入?|?碟中諜這么火,我用機(jī)器學(xué)習(xí)做個(gè)迷你推薦系統(tǒng)電影
小工具:?Pdf轉(zhuǎn)Word,輕松搞定表格和水印!?|?一鍵把html網(wǎng)頁(yè)保存為pdf!|??再見(jiàn)PDF提取收費(fèi)!?|?用90行代碼打造最強(qiáng)PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換?|?制作一款釘釘?shù)蛢r(jià)機(jī)票提示器!?|60行代碼做了一個(gè)語(yǔ)音壁紙切換器天天看小姐姐!|
年度爆款文案
點(diǎn)閱讀原文,看200個(gè)Python案例

