菜鸟入门!Django入门案例:图书管理系统

59e5784daf571497759bce6610c37c27.png

大家好,我是菜鸟哥!

Web开发,也就是写网站,是Django的一大应用方向。而Django就是目前最流行的python web框架之一。很多同学想了解这方面的学习案例,今天我们就给大家分享一个:用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

操作后目录结构:

cb788384e25262aeab053ad0f629a0a6.png

安装应用

在 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

以下是表格关联说明:

5fee30649b1460de8e144838d33c2401.png

修改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

执行后生成的文件:

947bb78f3e5fa31a8521368a8a5efaf2.png

插入初始数据

使用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文件拷贝到该目录下并修改:

2c7f4593931ffad55020b2128bb61589.png

修改为如下内容:

{% 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

1f66dc61244ea3c081462f7cf2663b3f.png

操作演示

查询所有作者所写的书:

0e5d970c82ce37244bd2be99b66dc5ae.png

查询每本书所属的出版社和作者:

7b88a1b0ca2ae195b376e7fa63b1b8d7.png

查询每个出版社所出的书:

0458d95d59121343c097fe7b2ba8dcfd.png

修改作者信息:

5a6a2c1d001b7579bf97688aee842469.png

修改书籍信息,可管理所归属的作者:

d1a12477ed4477be3c8289109740c57a.png

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

81425416f08310f9bbd5b3eb80dcc721.png

支持搜索和过滤:

65eaa86e46589ca64ca98584c80ebae9.png 8277e04279049d98fcaaf22443f9a4b6.png 以上就是整个图书管理系统的开发过程。

福利时间

我们的传统项目 每个月给铁杆粉丝送书的活动又来啦的,这次送出的7好书。11月上榜的Top7位同学,都是常来留言区指导工作的粉丝,再次感谢小伙伴的一路相随,欢迎大家常来,混面熟。

f12529e819d9aa65c55c51648bb61059.png

这次送出的图书是“Go语言区块链应用开发”。一共7本,中奖的同学公众号后台输入:小助手,速来联系他,提交你的快递信息。

推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

点阅读原文,看200个Python案例

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值