zoukankan      html  css  js  c++  java
  • 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请求的参数

  • 相关阅读:
    iaas,paas,saas理解
    July 06th. 2018, Week 27th. Friday
    July 05th. 2018, Week 27th. Thursday
    July 04th. 2018, Week 27th. Wednesday
    July 03rd. 2018, Week 27th. Tuesday
    July 02nd. 2018, Week 27th. Monday
    July 01st. 2018, Week 27th. Sunday
    June 30th. 2018, Week 26th. Saturday
    June 29th. 2018, Week 26th. Friday
    June 28th. 2018, Week 26th. Thursday
  • 原文地址:https://www.cnblogs.com/fjiqiang/p/10874830.html
Copyright © 2011-2022 走看看