Django---简易图书管理系统

一丶配置

创建app01

# 1.在具有manage.py文件的目录下,启动cmd,创建一个新的app01
python manage.py startapp app01 # 2.在settings配置文件中对 app01进行注册
INSTALLED_APPS=[
'app01.apps.App01Config',
] # 额外:创建整个项目时,创建新的app,pycharm会默认帮你注册 . 若是cmd创建,需要手动注册

静态文件配置:

# settings文件,配置静态资源
STATIC_URL = '/static/' # 固定写法: 映射关系,从项目中引入静态资源是通过/static/开头 STATICFILES_DIRS=[ # 固定写法: 项目文件夹下创建一个static文件夹'存放'静态资源.
os.path.join(BASE_DIR,'static')
]

数据库配置:

# settings文件,配置数据库 (使用的是mysql数据库,库需要先创建好)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'day55_bookmgsystec', # 数据库名
'USER': 'XXX', # 用户
'PASSWORD': 'XXX', # 密码
'HOST': '127.0.0.1', # ip地址
'PORT': 3306, # 端口
}
} # 由于使用的是mysql数据库.python3需要使用pymysql去连接数据库.默认提供的数据库连接不支持mysql
# 1.在与项目同名的文件夹下 ,找到__init__.py文件
# 2.编写连接代码
import pymysql
pymysql.install_as_MySQLdb() # 连接mysql数据库

额外:

# 在settings文件中找到下面的句子注释掉. post提交数据时需要进行校验
'django.middleware.csrf.CsrfViewMiddleware',

二丶数据库编写

使用orm操作数据库:

# 1.找到app01下的 models.py文件. 创建表和字段
class Pub(models.Model): # Pub 类名 等同于 表名
pid=models.AutoField(primary_key=True) # pid 类的属性 等同于 表的字段(AutoFiled:自增)
pname=models.CharField(max_length=32,unique=True) # pname 同理

数据迁移

# 1.在models.py文件已经编写好了表的信息. 需要把信息同步到数据库
# 2.启动Terminal窗口执行两条命令
# 检查models.py文件是否进行了变更,并记录.会在migrations文件夹下创建一个变更记录文件
python manage.py makemigrations # 将在migrations文件夹下创建一个变更记录文件,同步到数据库
python manage.py migrate

三丶路由关系

查看

# 1.在url.py穿件一个请求和函数的对应关系
from django.conf.urls import url
from django.contrib import admin
from app01 import views # 导入app01 urlpatterns = [
url(r'^publisher_list/', views.publisher_list),
] # 2.在app01下的views.py文件中编写函数
from app01 import models # 导入 models文件,使用orm操作数据库
# 查询列表
def publisher_list(request): # 查询全部的内容, 按照pid排序
all_pub = models.Pub.objects.all().order_by('pid') # 返回一个页面,并把数据传到页面
return render(request, 'publisher_list.html', {'all_pub': all_pub})
<!-- publisher_list.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style> table, h1 {
text-align: center;
} button {
position: absolute;
top: 60px;
left: 520px;
}
</style>
</head>
<body>
<h1>图书管理系统</h1>
<button>添加</button>
<table border="1px" width="500px" align="center">
<thead>
<tr>
<th>序号</th>
<th>编号</th>
<th>出版社名称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<!-- 使用模版语言:把传过来的数据 进行解析,展示
{{变量}}
-->
{% for pub in all_pub %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ pub.pid }}</td>
<td>{{ pub.pname }}</td>
<td>
<a href="/publisher_edit?pk={{ pub.pk }}">编辑</a> |
<a href="/publisher_del?pk={{ pub.pk }}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<script>
window.onload= function () { var tag=document.getElementsByTagName('button')[0]
tag.onclick=function () {
location.href='/publisher_add' //添加按钮跳转到添加页面
}
}
</script>
</body>
</html>

增加

# 1.在url.py穿件一个请求和函数的对应关系
from django.conf.urls import url
from django.contrib import admin
from app01 import views # 导入app01 urlpatterns = [
url(r'^publisher_add/', views.publisher_add),
] # 2.在app01下的views.py文件中编写函数
from app01 import models # 导入 models文件,使用orm操作数据库
# 添加
def publisher_add(request): pub_name, error = '', ''
# 判断发送方式 是不是post请求
if request.method == 'POST': # 获取提交的信息
pub_name = request.POST.get('pname') # 对应前端inpu, t框的name值 # 如果输入为空
if not pub_name:
error = '输入的内容为空'
elif models.Pub.objects.filter(pname=pub_name):
# 数据库里是否存在当前数据的值
error = '出版社名称已存在'
else:
# 添加
# 方式一
models.Pub.objects.create(pname=pub_name)
# 方式二
# obj = models.Publisher(name=pub_name)
# obj.save() return redirect(to='/publisher_list/') return render(request, 'publisher_add.html', {'error': error, 'data': pub_name})
<!-- publisher_add.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post" style="text-align: center">
<h1>添加出版社</h1>
<input type="text" name="pname" value="{{ data }}"/>
<br>
<span style="color: red;">{{ error }}</span>
<br>
<input type="submit"/>
<input type="reset" id="rest" value="取消"/>
</form>
<script>
window.onload = function () {
var back = document.getElementById('rest')
back.onclick = function () {
location.href = '/publisher_list' }
}
</script>
</body>
</html>

编辑

# 1.在url.py穿件一个请求和函数的对应关系
from django.conf.urls import url
from django.contrib import admin
from app01 import views # 导入app01 urlpatterns = [
url(r'^publisher_edit/', views.publisher_edit),
] # 2.在app01下的views.py文件中编写函数
from app01 import models # 导入 models文件,使用orm操作数据库
# 编辑
def publisher_edit(request):
error, data = '', '' # 从url 获得 pk的值
pk = request.GET.get('pk') # 从数据库里查询符合条件的第一个对象
obj = models.Pub.objects.filter(pk=pk).first() # 从数据库中查不出数据
if not obj:
return HttpResponse('更新数据不存在') if request.method == 'POST':
# 获得表单 提交的数据
pname = request.POST.get('pname')
if not pname:
error = '内容为空'
elif models.Pub.objects.filter(pname=pname):
error = '出版社已存在'
else:
# 更改 已经查询出来 obj对象的值
obj.pname = pname
# 提交
obj.save()
return redirect(to='/publisher_list') return render(request, 'publisher_edit.html', {'error': error, 'data': obj})
<!-- publisher_edit.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post" style="text-align: center">
<h1>更新出版社</h1>
<input type="text" name="pname" value="{{ data.pname }}"/>
<br>
<span style="color: red;">{{ error }}</span>
<br>
<input type="submit" value="更新"/>
<input type="reset" id="rest" value="取消"/>
</form>
<script>
window.onload=function () {
var back=document.getElementById('rest')
back.onclick=function () {
location.href='/publisher_list'
}
}
</script>
</body>
</html>

删除

# 1.在url.py穿件一个请求和函数的对应关系
from django.conf.urls import url
from django.contrib import admin
from app01 import views # 导入app01 urlpatterns = [
url(r'^publisher_del/', views.publisher_del),
] # 2.在app01下的views.py文件中编写函数
from app01 import models # 导入 models文件,使用orm操作数据库
# 删除
def publisher_del(request):
# 获得url的pk的值
pk = request.GET.get('pk') # 从数据库中查一下, 看看有没有,
# query = models.Pub.objects.filter(pk=pk) # 对象列表
obj = models.Pub.objects.filter(pk=pk).first() # 获取第一个对象 if not obj:
return HttpResponse('删除的不存在') # 删除数据 # 方式一 ,删除所有列表对象中,符合条件的所有值
# query.delete() # 方式二 # 按照索引删
# query[0].delete() # 方式三
obj.delete() # 跳转到展示页面
return redirect(to='/publisher_list')

Django---简易图书管理系统(B/S架构)的更多相关文章

  1. 11 基于django的图书管理系统 多表

    1.需求 作业需求:1.列出图书列表.出版社列表.作者列表2.点击作者,会列出其出版的图书列表3.点击出版社,会列出旗下图书列表4.可以创建.修改.删除 图书.作者.出版社 踩分点:1.满足需求1,2 ...

  2. Python高级进阶(二)Python框架之Django写图书管理系统(LMS)

    正式写项目准备前的工作 Django是一个Web框架,我们使用它就是因为它能够把前后端解耦合而且能够与数据库建立ORM,这样,一个Python开发工程师只需要干自己开发的事情就可以了,而在使用之前就我 ...

  3. 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(3) - 使用Conductor切换页面

    前两章中, 我们已经实现了这个图书管理系统的登录窗口, 并实施了完善的单元测试. 该是时候回过头来关注我们的主窗口了. 一个功能丰富的系统一般会有多个页面, 我们图书管理系统虽然是"简易&q ...

  4. Django练习——图书管理系统

    Django图书管理系统 创建一个项目 1. django-admin startproject 图书管理 2. cmd 命令终端下创建一个app python manage.py startapp ...

  5. C语言: 简易图书管理系统

    这只是一个简易的图书管理系统,虽然它有千余行代码,不过终究是个简单基本的东西. 在Linux系统下,用Vim编写,如要在Windows上运行则需要一些改动,主要是一些调用系统函数的改动.如Window ...

  6. Django(图书管理系统)

    图书管理系统 注意事项 1.models 要创建好,规划好自己的表,以及各种表关系 2.url正则要写好 3.settings的配置 4.利用bootstarp 进行布局更漂亮哦 5.注意orm  各 ...

  7. Django学习——图书管理系统图书修改、orm常用和非常用字段(了解)、 orm字段参数(了解)、字段关系(了解)、手动创建第三张表、Meta元信息、原生SQL、Django与ajax(入门)

    1 图书管理系统图书修改 1.1 views 修改图书获取id的两种方案 1 <input type="hidden" name="id" value=& ...

  8. 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(4) - 图书列表界面

    在前三章中我们完成了登录窗口, 并掌握了使用Conductor来切换窗口, 但这些其实都是在为我们的系统打基础. 而本章中我们就要开始开发系统的核心功能, 即图书管理功能了. 通过本章, 我们会接触到 ...

  9. 简易图书管理系统(主要是jsp的练习)

    1:首先设计用户表和图书表,设计的字段和类型如下图所示 1.1:用户表user 1.2:图书表book 2:第二写实体类user.java和book.java package com.bie.po; ...

  10. Django之图书管理系统

    出版社的增删改查 展示出版社列表: 1. 创建一个表结构:   2. 再配合那俩条命令即可创建一个press表 创建出版社函数,并在url中进行配置 创建HTML页面,展示出版社的表 for循环 {% ...

随机推荐

  1. pyinstaller安装及使用

    pyinstaller使用 将.py文件转换成无需源码的.exe可执行文件 下载 1.打开cmd直接输入pip install pyinstaller即可下载 2.如第一种方法无法下载,打开pyins ...

  2. 用JSON.parse(JSON.stringify(itemData))序列化反序列化实现‘深度复制’

    还可以用来去除值不具有JSON 表示形式(数字.字符串.逻辑值.数组.对象.null)的属性,也就是说像undefined和function这样的属性值.

  3. NOIP 2008 传球游戏

    洛谷 P1057 传球游戏 洛谷传送门 JDOJ 1536: [NOIP2008]传球游戏 T3 JDOJ传送门 Description ​ 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次, ...

  4. JDOJ 2982: 最大连续子段和问题

    洛谷 P1115 最大子段和 洛谷传送门 JDOJ 2982: 最大连续子段和问题 JDOJ传送门 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入格式 第一行是一个正整数NN, ...

  5. Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 1)

    A. Alternating Sum 就是个等比数列,特判公比为 $1$ 的情况即可. #include <bits/stdc++.h> using namespace std; ; ; ...

  6. Ajax运用与分页

    目录 django与ajax的分页处理 ajax + sweetAlert 实现再次确认: 批量数据插入 分页: django与ajax的分页处理 ajax + sweetAlert 实现再次确认: ...

  7. Java class 和public class 区别

    1.类的访问权限 为了控制某个类的访问权限,修饰词必须出现在关键字class之前.例如:public class Student {}    在编写类的时候可以使用两种方式定义类:    (A)pub ...

  8. VS Code 安装与配置(使用MSYS2环境与mingw-w64 编译环境)

     更正了顺序,之前不知道怎么回事,内容顺序乱了 力求完美.详细,所以希望懂的人留言指点一下. 目前已经开始添加原理解释,希望大家能分享一些gcc gdb C语言等方面优秀链接 后续会慢慢增添内容,修正 ...

  9. 使用Swagger2构建SpringMVC项目中的Restful API文档

    使用Swagger自动生成API文档,不仅增加了项目的可维护性,还提高了API的透明度更利于快速测试等工作,便于更快地发现和解决问题. 本篇文章只记录整合过程,关于Security Configura ...

  10. 记忆的轮廓 期望 四边形不等式dp|题解

    记忆的轮廓 题目描述 通往贤者之塔的路上,有许多的危机.我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增,在[1,n]中,一共有n个节点.我们把编 ...