Python框架:Django写图书管理系统(LMS)

article/2025/10/5 4:39:04

今天我会带大家真正写一个Django项目,对于入门来说是有点难度的,因为逻辑比较复杂,但是真正的知识就是函数与面向对象,这也是培养用Django思维写项目的开始

Django文件配置

Django模版文件配置

文件路径 test_site -- test_site -- settings.py

TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, "template")],  # template文件夹位置'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',],},},
]

 

Django静态文件配置

文件路径 test_site -- test_site -- settings.py

STATIC_URL = '/static/'  # HTML中使用的静态文件夹前缀
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static"),  # 静态文件存放位置
]

看不明白?有图有真相:

 

刚开始学习时可在配置文件中暂时禁用csrf中间件,方便表单提交测试。

文件路径 test_site -- test_site -- settings.py

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Django 数据库配置

Django为什么要配置数据库

因为Django默认采用的是sqlite3数据库,而我们用Pycharm编写程序时使用的是Pymysql模块和数据库交互的,为了能够简化编写程序的流程,我们需要修改默认数据库配置

在修改数据配置之前,我们是不是要先有数据库,请先创建一个MySQL数据库吧

文件路径 test_site -- test_site -- settings.py

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql',  # 注意这几个用大写的单词,必须写大写,这些坑我都走过,也浪费了不少时间,希望你不要再走'NAME': 'test_site','HOST': '127.0.0.1','PORT': 3306,'USER': 'root','PASSWORD': '',  # 我的数据库是没有密码的,你的密码是什么就写什么,没有就留空}
}

在和settings.py同目录下的 __init__.py文件中做配置

文件路径 test_site -- test_site -- __init__.py

import pymysql
pymysql.install_as_MySQLdb()

至此,用Django写项目,相关的配置已完成,但是有一些关于Django的基础知识要学习,就像print一样简单,这也是我们写项目的准备工作之一

Django基础必备三件套(三个小模块)

HttpResponse 把数据返回给浏览器

这个模块名字起的特别好,根据名字就能大概猜出来的他的意思,真会起名字,不想某些人,写一套编程语言,用个什么蟒蛇,写个框架用个乐手的名字,真的是不为程序员着想

内部传入一个字符串,返回给浏览器,我们在上一章的Hello World就是这么写的

def index(request):# 业务逻辑代码return HttpResponse("Hello World")

render 对位填充

render 本意就是着色,粉刷的意思,很好理解,使用方式需要记住

除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。

将数据填充进模板文件,最后把结果返回给浏览器。(类似于我们上章用到的jinja2)

def index(request):# 业务逻辑代码return render(request, "index.html", {"name": "Albert", "hobby": ["音乐", "篮球"]})

redirect 重定向

接受一个URL参数,表示跳转到指定的URL

注意:“” 里面的两个/ / 能少,不写会报错!注意:“” 里面的两个/ / 能少,不写会报错!注意:“” 里面的两个/ / 能少,不写会报错!

def index(request):# 业务逻辑代码return redirect("/home/")

重定向实现原理 

redirect 默认的302(临时重定向),30* 都是重定向,301是永久重定向,对于seo工程师用永久重定向比较多,如果要变为永久重定向,只需要

在redirect()里面增加这段代码即可

permanent=True

Django写图书管理系统

目标要求:

  • 分别展示出出版社页面,书籍页面和作者页面

  • 一个出版社可以出版多本书籍(一对多)

  • 一个作者可以写多本书,一本书也可有多个作者(多对多)

在完成以上配置之后,其实这个程序就已经写了一半了,是Django帮你写的,接下来真正的Python代码我们只需要写函数和类,在实际的工作中,也是这样的

为了能让大家更清楚掌握用Django写程序的过程,接下来我们按照过程先后带领大家把这个程序实现

创建Django项目

开始项目

在终端下写入如下指令

# Django-admin startproject lms# cd lms# python3 manage.py startapp app01

当然以上操作你也可以在Pycharm上进行,完全没有问题

创建数据库

注意数据库的名字,自己创建

修改配置

按照以上方法操作执行

建立url对应关系

在用户通过链接访问你的网站的时候,对于用户来说这是一个链接地址,对于程序来时其实是一个函数,通过这个函数才找到数据库中的对象,对象的方法和整个的前端页面

文件路径:和settings同目录下

"""lms URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views1. Add an import:  from my_app import views2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
Class-based views1. Add an import:  from other_app.views import Home2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.conf.urls import url, include2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin
from app01 import viewsurlpatterns = [# 管理员账户登陆url(r'^admin/', admin.site.urls),# 出版社列表url(r'^publisher_list/', views.publisher_list),# 添加出版社url(r'^add_publisher/', views.add_publisher),# 删除出版社url(r'^drop_publisher/', views.drop_publisher),# 修改出版社url(r'^edit_publisher/', views.edit_publisher),url(r'^book_list/', views.book_list),url(r'^add_book/', views.add_book),url(r'^drop_book/', views.drop_book),url(r'^edit_book/', views.edit_book),url(r'^author_list/', views.author_list),url(r'^add_author/', views.add_author),url(r'^drop_author/', views.drop_author),url(r'^edit_author/', views.edit_author),url(r'^$', views.publisher_list),  # 只有跟网址,默认匹配
]

 

开始写Django项目

创建对象,并关联数据库

  找到app01这个文件夹,也就是项目应用的主文件夹下面有modes.py 文件,这个文件就是我们用来存放类和对象的文件,这里需要用到ORM(对象关系映射),这里我们先记住他的使用方法就好了,过几天带大家手写一个ORM。

注意:其他文件不要动,其他文件不要动,其他文件不要动

from django.db import models# Create your models here.# 出版社类
class Publisher(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=64)# 书籍的类
class Book(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=64)publisher = models.ForeignKey(to=Publisher)  # Django中创建外键联表操作# 作者的类
class Author(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=64)# 一个作者可以对应多本书,一本书也可以有多个作者,多对多,在数据库中创建第三张表book = models.ManyToManyField(to=Book)

写核心逻辑函数

同样是app01文件夹下的views.py这个文件,上面的urls.py文件中的函数都是从这个文件中引入的,这个文件是最主要的文件

from django.shortcuts import render, redirect# Create your views here.
from app01 import models# 出版社列表
def publisher_list(request):# 查询publisher = models.Publisher.objects.all()  # ORM中的查询全部# 渲染return render(request, 'publisher_list.html', {'publisher_list': publisher})# 添加出版社
def add_publisher(request):# POST请求表示用户已提交数据if request.method == 'POST':new_publisher_name = request.POST.get('name')models.Publisher.objects.create(name=new_publisher_name)return redirect('/publisher_list/')# 渲染待添加页面给用户return render(request, 'add_publisher.html')# 删除出版社
def drop_publisher(request):# GET请求拿到url中的IDdrop_id = request.GET.get('id')drop_obj = models.Publisher.objects.get(id=drop_id)drop_obj.delete()return redirect('/publisher_list/')# 编辑出版社
def edit_publisher(request):if request.method == 'POST':edit_id = request.GET.get('id')edit_obj = models.Publisher.objects.get(id=edit_id)new_name = request.POST.get('name')edit_obj.name = new_name# 注意保存edit_obj.save()return redirect('/publisher_list/')edit_id = request.GET.get('id')edit_obj = models.Publisher.objects.get(id=edit_id)return render(request, 'edit_publisher.html', {'publisher': edit_obj})# 书籍的列表
def book_list(request):book = models.Book.objects.all()return render(request, 'book_list.html', {'book_list': book})# 添加本书籍
def add_book(request):if request.method == 'POST':new_book_name = request.POST.get('name')publisher_id = request.POST.get('publisher_id')models.Book.objects.create(name=new_book_name, publisher_id=publisher_id)return redirect('/book_list/')res = models.Publisher.objects.all()return render(request, 'add_book.html', {'publisher_list': res})# 删除本书籍
def drop_book(request):drop_id = request.GET.get('id')drop_obj = models.Book.objects.get(id=drop_id)drop_obj.delete()return redirect('/book_list/')# 编辑本书籍
def edit_book(request):if request.method == 'POST':new_book_name = request.POST.get('name')new_publisher_id = request.POST.get('publisher_id')edit_id = request.GET.get('id')edit_obj = models.Book.objects.get(id=edit_id)edit_obj.name = new_book_nameedit_obj.publisher_id = new_publisher_idedit_obj.save()return redirect('/book_list/')edit_id = request.GET.get('id')edit_obj = models.Book.objects.get(id=edit_id)all_publisher = models.Publisher.objects.all()return render(request, 'edit_book.html', {'book': edit_obj, 'publisher_list': all_publisher})# 作者的列表
def author_list(request):author = models.Author.objects.all()return render(request, 'author_list.html', {'author_list': author})# 添加个作者
def add_author(request):if request.method == 'POST':new_author_name = request.POST.get('name')models.Author.objects.create(name=new_author_name)return redirect('/author_list/')return render(request, 'add_author.html')# 删除个作者
def drop_author(request):drop_id = request.GET.get('id')drop_obj = models.Author.objects.get(id=drop_id)drop_obj.delete()return redirect('/author_list/')# 修改下作者
def edit_author(request):if request.method == 'POST':edit_id = request.GET.get('id')edit_obj = models.Author.objects.get(id=edit_id)new_author_name = request.POST.get('name')new_book_id = request.POST.getlist('book_id')edit_obj.name = new_author_nameedit_obj.book.set(new_book_id)edit_obj.save()return redirect('/author_list/')edit_id = request.GET.get('id')edit_obj = models.Author.objects.get(id=edit_id)all_book = models.Book.objects.all()return render(request, 'edit_author.html', {'author': edit_obj,'book_list': all_book})

 写前端页面

前端基本上是一直在重复的页面,注意几个与后端建立联系的地方就好了

<tbody>{% for publisher in publisher_list %}<tr><td>{{ forloop.counter }}</td><td>{{ publisher.name }}</td><td class="text-center"><a class="btn btn-info btn-sm" href="/edit_publisher/?id={{ publisher.id }}"><iclass="fa fa-pencil fa-fw"aria-hidden="true"></i>编辑</a><a class="btn btn-danger btn-sm" href="/drop_publisher/?id={{ publisher.id }}"><iclass="fa fa-trash-o fa-fw"aria-hidden="true"></i>删除</a></td></tr>{% endfor %}</tbody>

 

前端复杂的部分是与数据库多表查询的部分,需要用for循环,注意for循环在Django中的使用方式

 

<select class="form-control" name="publisher_id">{% for publisher in publisher_list %}{# 如果当前循环到的出版社 和 书关联的出版社 相等 #}{% if publisher == book.publisher %}<option selectedvalue="{{ publisher.id }}">{{ publisher.name }}</option>{% else %}<option value="{{ publisher.id }}">{{ publisher.name }}</option>{% endif %}{% endfor %}</select>

 

完整代码已上传到GIthub,请点击我的github:https://github.com/mayite/lms访问下载

原创作者:马一特

文章出处:http://www.cnblogs.com/mayite/


http://chatgpt.dhexx.cn/article/1sR6PVwO.shtml

相关文章

五个学习管理系统的优点

正如我们先前提到过的&#xff0c;对于公司来说&#xff0c;建立“学习型文化”可以带来许许多多的好处。然而&#xff0c;企业规模会越来越大&#xff0c;员工的培训学习需求并不会减少&#xff0c;这也会为企业的员工培训带来压力。学习管理系统&#xff08;LMS&#xff09;可…

Canvas-lms 开源在线学习管理系统源码部署(生产版)

我们的产品&#xff1a; https://canvaslms.zut.edu.cn/ 开始接到部署 Canvas-lms 这个开源教学平台 的任务时&#xff0c; 还不知道 Canvas-lms 是什么 &#xff0c; 网上关于他的介绍也比较少&#xff0c;上面只给了Canvas GitHub的源码地址和使用指南 Canvas-lms系…

学习管理系统五大好处

正如我们先前提到过的&#xff0c;对于公司来说&#xff0c;建立“学习型文化”可以带来许许多多的好处。然而&#xff0c;企业规模会越来越大&#xff0c;员工的培训学习需求并不会减少&#xff0c;这也会为企业的员工培训带来压力。学习管理系统&#xff08;LMS&#xff09;可…

7个最好的WordPress LMS在线学习管理系统比较

您是否正在为您的 WordPress 网站寻找最好的 LMS 在线学习管理系统插件&#xff1f; 学习管理系统 (LMS) 插件允许您创建和运行类似 Udemy 和 LearnDesk 等在线课程。一个完美的 WordPress LMS 插件拥有您管理在线课程、运行和评分测验、接受付款等所需的一切。 在本文中&…

html5在线学习系统,Canvas LMS 在线学习管理系统

账户设置 自定义帮助链接和标志 只有管理员可以修改哦 Help link text displays in the Global Navigation Menu&#xff0c; the footer of the login page&#xff0c; and the top menu bar in SpeedGrader. link text should be no more than 30 characters. The navigatio…

使用python库relate搭建LMS学习管理系统

Relate is an Environment for Learning And TEaching Relate是在 Django上面构建的&#xff0c;可以快速搭建LMS系统&#xff0c;该系统可以方便学习管理和在线课程的发放&#xff1b; 由于最近弄了一个python的课程&#xff0c;所以自己动手测试了以下这个框架 Relate本身包含…

关于学习管理系统 LMS

一、先了解SCORM是什么&#xff1a; 共享内容对象参考模型&#xff08;Sharable Content Object Reference Model&#xff09;是由美国国防部"高级分布式学习"&#xff08;Advanced Distributed Learning&#xff0c;以下简称ADL&#xff09;组织所拟定的标准&#x…

LearnDash:可用的最通用的在线教育系统和LMS学习管理系统

在电子学习行业&#xff0c;大多数学习管理系统都提供了创建具有竞争力的教育网站的基本特性和功能。 LearnDash、 Teachable、Moodle、Thinkific 和 Blackboard 是一些已经声名远扬的玩家。 对于任何想要开始和发展在线学习业务和在线教育平台的人来说&#xff0c;您都需要从长…

[Python从零到壹] 十五.文本挖掘之数据预处理、Jieba工具和文本聚类万字详解

欢迎大家来到“Python从零到壹”&#xff0c;在这里我将分享约200篇Python系列文章&#xff0c;带大家一起去学习和玩耍&#xff0c;看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解&#xff0c;真心想把自己近十年的编程经验分享给大家&#xff0c;希望…

文本数据分析的作用是什么?文本数据分析可采用哪些方法?

文本数据分析的作用: 文本数据分析能够有效帮助我们理解数据语料, 快速检查出语料可能存在的问题, 并指导之后模型训练过程中一些超参数的选择. 常用的几种文本数据分析方法: 标签数量分布句子长度分布词频统计与关键词词云 我们将基于真实的中文酒店评论语料来讲解常用的几…

文本数据处理

文本数据处理 文本数据处理常见任务 文本分类 文本分类是按照一定的分类体系&#xff0c;将文档判别为预定的若干类中的某一类或某几类。信息检索 指将信息&#xff08;此处指代文本&#xff09;按一定的方式组织起来&#xff0c;根据用户的需求将相关信息查找出来信息抽取 将…

一文看懂什么是文本挖掘

一、什么是文本挖掘 文本挖掘指的是从文本数据中获取有价值的信息和知识&#xff0c;它是数据挖掘中的一种方法。文本挖掘中最重要最基本的应用是实现文本的分类和聚类&#xff0c;前者是有监督的挖掘算法&#xff0c;后者是无监督的挖掘算法。 文本挖掘是一个多学科混杂的领…

【文本挖掘】关键词提取

统计关键词前20位 数据集如下&#xff1a; 地址&#xff1a; https://github.com/Algernon98/github-store/tree/main/data./text./genshin. from gensim import corpora, models import config import jieba import jieba.analyse import train from codecs import openstop…

文本挖掘系列之文本信息抽取

文本数据挖掘的定义 文本数据挖掘是一种利用计算机处理技术从文本数据中抽取有价值的信息和知识的应用驱动型学科。文本数据挖掘处理的数据类型是文本数据&#xff0c;属于数据挖据的一个分支&#xff0c;与机器学习、自然语言处理、数理统计等学科具有紧密联系。文本挖掘在很…

数据分析案例-文本挖掘与中文文本的统计分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Python数据挖掘-NLTK文本分析+jieba中文文本挖掘

一、NLTK介绍及安装 &#xff08;注&#xff1a;更多资源及软件请W信关注“学娱汇聚门”&#xff09; 1.1 NLTK安装 NLTK的全称是natural language toolkit&#xff0c;是一套基于python的自然语言处理工具集。 nltk的安装十分便捷&#xff0c;只需要pip就可以。相对Python2…

文本挖掘详解

一、文本挖掘概念 在现实世界中&#xff0c;可获取的大部信息是以文本形式存储在文本数据库中的&#xff0c;由来自各种数据源的大量文档组成&#xff0c;如新闻文档、研究论文、书籍、数字图书馆、电子邮件和Web页面。由于电子形式的文本信息飞速增涨&#xff0c;文本挖掘已经…

什么是文本挖掘 ?

什么是文本挖掘   文本挖掘是抽取有效、新颖、有用、可理解的、散布在文本文件中的有价值知识&#xff0c;并且利用这些知识更好地组织信息的过程。1998年底&#xff0c;国家重点研究发展规划首批实施项目中明确指出&#xff0c;文本挖掘是“图像、语言、自然语言理解与知识…

文本数据分析:文本挖掘还是自然语言处理?

数据分析师Seth Grimes曾指出“80%的商业信息来自非结构化数据&#xff0c;主要是文本数据”&#xff0c;这一表述可能夸大了文本数据在商业数据中的占比&#xff0c;但是文本数据的蕴含的信息价值毋庸置疑。KDnuggets的编辑、机器学习研究者和数据科学家Matthew Mayo就在网站上…

Python数据挖掘-文本挖掘

文本挖掘概要 搞什么的&#xff1f; 从大量文本数据中&#xff0c;抽取出有价值的知识&#xff0c;并且利用这些知识更好的组织信息的过程。 目的是什么&#xff1f; 把文本信息转化为人们可利用的知识。 举例来说&#xff0c;下面的图表利用文本挖掘技术对库克iphoneX 发…