Django入門案例:圖書管理系統(tǒng)
大家好,歡迎來到 Crossin的編程教室 !
Web開發(fā),也就是寫網站,是Django的一大應用方向。而Django就是目前最流行的python web框架之一。很多同學想了解這方面的學習案例,今天我們就給大家分享一個:用Django實現(xiàn)圖書管理系統(tǒng)
無需寫sql,不需寫前端,利用Django自帶的Admin和ORM框架就能輕松實現(xiàn)一個多對多表關系的增刪改查。
開發(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)建項目和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
以下是表格關聯(lián)說明:

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

插入初始數(shù)據(jù)
使用DataSource打開db.sqlite3文件后,執(zhí)行以下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);
后臺管理
管理界面本地化:
將顯示的語言、時間等使用本地的習慣,這里的本地化就是進行中國化,中國大陸地區(qū)使用簡體中文,時區(qū)使用亞洲/上海時區(qū),注意這里不使用北京時區(qū)表示 打開booktest/booktest/settings.py文件,找到語言編碼、時區(qū)的設置項,將內容改為如下:
LANGUAGE_CODE?=?'zh-Hans'
TIME_ZONE?=?'Asia/Shanghai'
創(chuàng)建管理員:
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',
????????????],
????????},
????},
]
創(chuàng)建目錄booktest/templates/admin,將python安裝路徑下的Lib\site-packages\django\contrib\admin\templates\admin下的base_site.html文件拷貝到該目錄下并修改:

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

操作演示
查詢所有作者所寫的書:

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

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

修改作者信息:

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

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

支持搜索和過濾:


作者:小小明
來源:快學Python(kxpython)
_往期文章推薦_
?
