Django框架之图书管理系统(一)

图书管理系统共分为两篇博客进行讲解,该篇博客主要记录图书与出版社之间的关系(一对一),记录图书的增删查改操作

==================================================

一、数据库设计

图书管理系统共分为三个角色:图书,出版社,作者

一本书  ========  一个出版社

一本书  ======== 多个作者

一个作者 ======= 多本书

出版社与书之间的关系:一对多的关系   =====》外键

书于作者之间的关系:多对多的关系 =====》用第三张表做关联

=================================================

二、代码部分(只记录代码部分,使用的一些其他操作,可以根据我以前的记录进行学习)

1.创建一个app04模块,作为图书管理系统模块;在系统中注册模板文件夹和静态文件夹

2.创建图书与出版社的模型类,models.py代码如下:

from django.db import models

# Create your models here.

class Publisher(models.Model):
    """
    出版社模型类
    """
    id=models.AutoField(primary_key=True)
    title=models.CharField(max_length=20)

class Books(models.Model):
    """
    图书模型类
    """
    id=models.AutoField(primary_key=True)
    bookname=models.CharField(max_length=24)
    publisher=models.ForeignKey(to="Publisher")

通过两个命令在数据库中创建这两个类的表

3.查

3.1 views.py中代码如下:

def show_bookmanager(request):
    """
    查询所有的图书记录
    :param request:
    :return:
    """
    get_all_books=Books.objects.all() # 通过ORM进行查询所有的数据
    return render(request,"allbooks.html",{"books":get_all_books})

3.2 项目同名文件夹下的url路径配置,urls.py中代码如下:

urlpatterns = [
    url(r‘^app04/‘,include(‘app04.urls‘)),
]

3.2 在app04模块下配置url路径,app04/urls.py中代码如下:

urlpatterns=[
    url(r‘^allbooks/$‘,show_bookmanager),
]

3.4 前端allbooks.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form>
    <table border="1">
        <tr>
            <td>ID</td>
            <td>book</td>
            <td>publisher</td>
        </tr>
        {% for book in books %}
        <tr>
            <td>{{ book.id }}</td>
            <td>{{ book.bookname }}</td>
            <td>{{ book.publisher.title }}</td>
        </tr>
        {% endfor %}

    </table>
</form>
</body>
</html>

启动manage.py通过http://127.0.0.1:8000/app04/allbooks/就可以通过浏览器访问图书的所有信息了

通过上述查的例子已经能查出所有的图书信息了,那么下面的步骤基本上和上面一致,就直接进行代码记录,最后总结里面的相关知识点

4.增

4.1 app04/urls.py代码如下:

urlpatterns=[
    url(r‘^allbooks/$‘,show_bookmanager),
    url(r‘^addbook/$‘,add_bookmanager),
]

4.2 views.py代码如下:

def add_bookmanager(request):
    """
    添加图书信息
    :param request:
    :return:
    """
    # 如果是通过get方法进行请求的数据,查询所有的出版社,用于显示到添加界面,供用户进行选择出版社
    if request.method=="GET":
        all_publisher = Publisher.objects.all()
        return render(request,"addbooks.html",{"publishers":all_publisher})
    # 如果通过post方法进行请求的数据,获取前端传递过来图书名称、出版社名称,然后插入到数据库中
    if request.method=="POST":
        get_book=request.POST.get(‘txtbookname‘,None) # 获取前端传递过来的图书名称
        get_pulisher=request.POST.get(‘selectpublisher‘,None) # 获取前端传递过来的出版社名称
        a=Books.objects.create(bookname=get_book,publisher_id=get_pulisher) # 插入数据
        return redirect("/app04/allbooks/") # 通过重定向,显示所有的数据

4.3 前端代码,在allbooks.html中添加一个跳转链接

<a href="/app04/addbook/">添加图书</a>

addbooks.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/app04/addbook/" method="post">
    <input type="text" name="txtbookname"/>&nbsp;
    <select name="selectpublisher">
        {% for p in publishers %}
            <option value="{{ p.id }}">{{ p.title }}</option>
        {% endfor %}
    </select>
    <input type="submit" value="添加"/>
</form>
</body>
</html>

5.删

5.1 app04/urls.py代码如下:

urlpatterns=[
    url(r‘^allbooks/$‘,show_bookmanager),
    url(r‘^addbook/$‘,add_bookmanager),
    url(r‘^delete/$‘,delete_bookmanager),
]

5.2 views.py代码如下:

def delete_bookmanager(request):
    """
    删除图书信息
    :param request:
    :return:
    """
    get_id=request.GET.get(‘id‘) # 获取前端传递过来的数据
    if get_id:  # 如果获取到了前端传递过来的数据,进行下一步
        delete_book=Books.objects.get(id=get_id) # 通过id获取到对应的图书信息
        delete_book.delete() # 删除对应的信息
    return redirect("/app04/allbooks/")

5.3 前端allbooks.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form>
    <a href="/app04/addbook/">添加图书</a>
    <table border="1">
        <tr>
            <td>ID</td>
            <td>book</td>
            <td>publisher</td>
            <td>operation1</td>
        </tr>
        {% for book in books %}
        <tr>
            <td>{{ book.id }}</td>
            <td>{{ book.bookname }}</td>
            <td>{{ book.publisher.title }}</td>
            <td><a href="/app04/delete/?id={{ book.id }}">删除</a></td>
        </tr>
        {% endfor %}

    </table>
</form>
</body>
</html>

6.改

6.1 app04/urls.py代码如下:

urlpatterns=[
    url(r‘^allbooks/$‘,show_bookmanager),
    url(r‘^addbook/$‘,add_bookmanager),
    url(r‘^delete/$‘,delete_bookmanager),
    url(r‘^editor/$‘,editor_bookmanager),
]

6.2 views.py代码如下:

def editor_bookmanager(request):
    """修改图书信息"""
    if request.method=="GET":
        get_id=request.GET.get(‘id‘) # 获取前端传递过来参数为id的数据
        if get_id:
            get_book=Books.objects.get(id=get_id) # 根据id获取到对应的数据信息
            get_publisher=Publisher.objects.all() # 查询出所有的出版社信息
            return render(request,"editorbooks.html",{"book":get_book,"publishers":get_publisher})
        else:
            return redirect("/app04/allbooks/")
    if request.method=="POST":
        get_id=request.POST.get(‘updateid‘)
        get_name=request.POST.get(‘updatename‘)
        get_publisher=request.POST.get(‘selectpublisher‘)
        # 以下四句代码都是进行修改数据的代码
        editor_book=Books.objects.get(id=get_id)
        editor_book.bookname=get_name
        editor_book.publisher_id=get_publisher
        editor_book.save()
        return redirect("/app04/allbooks/")

6.3前端editorbooks.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/app04/editor/" method="post">
<input type="text" name="updateid" value="{{ book.id }}" style="display: none;"/>
<input type="text" name="updatename" value="{{ book.bookname }}"/>

<select name="selectpublisher">
    {% for publisher in publishers %}
        {% if book.publisher_id == publisher.id %}
            <option selected value="{{ publisher.id }}" >{{ publisher.title }}</option>
            {% else %}
            <option value="{{ publisher.id }}">
                {{ publisher.title }}
            </option>
        {% endif %}
    {% endfor %}
</select>
<input type="submit" value="更新"/>
</form>
</body>
</html>

============================================

总结:

1.一对多关系

class Publisher(models.Model):
    """
    出版社模型类
    """
    id=models.AutoField(primary_key=True)
    title=models.CharField(max_length=20)

class Books(models.Model):
    """
    图书模型类
    """
    id=models.AutoField(primary_key=True) # 表的id,AutoField是自动增长,相当于设置auto_increment
    bookname=models.CharField(max_length=24) # 表的name,CharField是数据库中的varchar,max_length必须设置
    publisher=models.ForeignKey(to="Publisher") # 表的外键,这是一对多关键的所在,to="Publisher"表示关联Publisher模型类的主键

一对多的关系,主要在于设置外键,在该例子中图书是多,出版社是一的关系。

2.增删查改

在该例子中,如果想对图书类进行操作,就相当于对Books类进行操作,具体如下:

查:Books.objects.all() 查询出所有的信息,相当于sql语句:select * from 图书表

  Books.objects.get(id=1) 查询出id=1的图书信息,相当于sql语句:select * from 图书表 where id=1;

增:Books.objects.create(bookname="高等数学") 添加bookname="高等数学"的图书信息,相当于sql语句:insert into 图书表 (bookname) values (‘高等数学‘);

删:Books.objects.get(id=1).delete() 删除id=1的图书信息,详单与sql语句:delete from 图书表 where id=1

改:editor_book=Books.objects.get(id=1)

  editor_book.bookname="离散数学"

  editor_book.save()

  相当于sql语句:update 图书表set bookname="离散数学" where id=1;

3.request.GET.get(‘id‘,None)  表示获取get方法请求的参数,如果没有获取到,返回None,不会报错

 request.GET[‘id‘]  表示获取get方法请求的参数,如果没有获取到,会程序报错

同理:request.POSTget("id",None)和request.POST[‘id‘]的方法和上面介绍的方法类似,唯一的区别在于这两个方法是获取POST请求的参数

原文地址:https://www.cnblogs.com/fjiqiang/p/10874830.html

时间: 2024-10-12 16:04:10

Django框架之图书管理系统(一)的相关文章

使用Django开发一个图书管理系统 05---改造界面

BOOKMS是一个公司内部的图书管理系统. 本系列用多次迭代方法,逐步实现一个图书管理系统BOOKMS. 本文主要介绍使用bootstrap美化前台页面和修改admin模块的添加图书模块时使用豆瓣api获取数据. 再前一节里我们一件可以管理model(增删改查).但是界面是在是太简陋,简陋到但凡是个正常人估计都无法接受.项目组里没有专业的前端的话,页面美化是一个痛苦的事,但是有了bootstrap的帮助之后,我们的页面也能像模像样. 一.Bootstrap介绍 Bootstrap是Twitter

Python-Flask框架之——图书管理系统 , 附详解源码和效果图 !

该图书管理系统要实现的功能: 1. 可以通过添加窗口添加书籍或作者, 如果要添加的作者和书籍已存在于书架上, 则给出相应的提示. 2. 如果要添加的作者存在, 而要添加的书籍书架上没有, 则将该书籍添加到该作者栏. 3. 如果要添加的作者和书籍都不存在于书架上 , 则将书籍和作者一起添加. 4. 每个书籍和作者旁边都有一个删除按钮 , 点击删除书籍的按钮可以将该书籍删除 , 若某作者栏的书籍全部删除完毕则显示"无". 5. 若直接点击删除作者按钮, 则可以将该作者和其书籍一起全部删掉.

SSM 轻量级框架构建图书管理系统

一.大致效果展示图 二.整体编码思想 三.部分心得 3.1 连接数据库配置代码务需添加 &characterEncoding=utf8 3.2 配置文件需确定无误 3.3 方法名要见名思意 3.4 更改方法时,建议重写. 3.5 代码尽量做到整洁加备注 四.数据库带条件的模糊的查询语句 SELECT * From books where ${param1} like '%${param2}%'  order by createDate DESC limit ${param3},3 五.Maven

Django框架进阶5 models常用字段及参数, choices参数, 自动显示sql命令配置, orm查询优化相关, orm中的事务操作, MTV与MVC模型, 图书管理系统(图书的增删改查)

models中的常用字段 AutoField(primary_key=True) 主键   (int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列.) CharField(max_length=32)     varchar(32) IntegerField()       int BigIntergerField()           bigint DecimalField()    decimal EmailField(

在Django中使用ORM创建图书管理系统

一.ORM(对象关系映射) 很多语言的web框架中都有这个概念 1. 为什么要有ORM? 1. 写程序离不开数据,要使用数据就需要连接数据库,但是不同的数据库在sql语句上(mysql,oracle等)会有点区别, 因此直接在你的项目中使用sql语句的话,不便于以后的修改,万一更换了数据库,那所有sql语句不就要重新写吗? 所以这个时候ORM就体现出优点了,你只需要写ORM的代码,它就会根据你连接的数据库自动帮你翻译成对应的sql语句, 也就是说无论你使用的是mysql还是oracle,ORM操

Django之url上的include,URL命名和反向解析,命名空间 以及图书管理系统删除功能二合一方法

include其他的URLconfs #At any point, your urlpatterns can "include" other URLconf modules. This #essentially "roots" a set of URLs below other ones. #For example, here's an excerpt of the URLconf for the Django website itself. #It include

django 框架学习:十六.django 后台管理系统

前言 每个网站一般都有后台管理系统,为了方便管理,django框架也有后台管理系统,后台管理系统主要可以实现以下功能: 基于admin模块,可恶意实现类似数据库客户端的功能,对数据库进行增删改查. 基于该模块的数据管理功能,可以二次定制一些使用的功能. settings.py 配置 在INSTALLED_APPS中,默认已经添加相关模块. 'django.contrib.admin'  管理站点'django.contrib.auth'  认证系统'django.contrib.contentt

Django框架-模型层

Django框架-模型层 一.单表查询之必知必会13条 1.时间字段中的两个关键性参数 create_time = models.DateField() # 年月日 create_time = models.DateTimeField() # 年月日时分秒 # 两个关键性参数 # auto_now:每次操作数据 都会自动刷新当前操作的时间 # auto_now_add:在创建数据的时候 会自动将创建时间记录下来 后续的修改不会影响该字段 2.搭建测试环境 在django中,你可以写一个单独测试某

Django框架6

目录 Django框架6 一:models常用字段及参数 二:choices参数 三:orm数据库查询优化相关 四:orm中的事务操作 五:MTV与MVC模型 六:图书管理系统(图书的增删改查功能的实现) Django框架6 一:models常用字段及参数 ? AutoField(primary_key=True) 主键字段 ? CharField(max_length=32) varchar(32) ? IntergerField() int ? BigIntegerField() bigin