zoukankan      html  css  js  c++  java
  • 练习:Django实现简单的图书管理系统

    基于Django实现的一个简单的图书管理系统

    一、分析项目的需求

    1. 实现以下的两个页面
      展示所有图书的页面:

      添加、编辑图书的页面:

    2. 实现的功能:

      • 访问主页面时,需要从数据库把所有数据读出来,展示在页面上
      • 点击主页面的“添加”按钮时,跳转到添加书籍的页面,用户添加好数据点击提交,数据提交到数据库保存,并跳转到主页面,展示添加完成后所有的图书
      • 点击主页面的“编辑”按钮时,跳转到类似添加书籍的页面,input框内显示此行所有的数据,点击提交后,更新数据库此行的数据,并跳转到主页面,展示修改完成后所有的图书
      • 点击主页面的“删除”按钮时,删除此行数据,同步删除数据库中此行的内容

    二、建立Django项目,完成需求

    (一)、建立Django项目,连接mysql数据库

    1. 先建立一个库,比如library

    2. 配置settings,连接到mysql
      DATABASES = {
      'default': {
      'ENGINE': 'django.db.backends.mysql',
      'NAME': 'library',
      'HOST':'127.0.0.1',
      'PORT':3306,
      'USER':'root',
      'PASSWORD':'123'
      }
      }

    3. 在app01应用中的models.py文件中,建立表结构
      id、书名、价格、出版日期、出版社
      from django.db import models

      class MyLibrary(models.Model):
          id = models.AutoField(primary_key=True)
          book_name = models.CharField(max_length=20)
          price = models.FloatField()
          pub_date = models.DateField()
          publish = models.CharField(max_length=30)
      
    4. 在项目文件下的init.py文件中加入这两句话
      import pymysql
      pymysql.install_as_MySQLdb()

    5. 最后执行数据库同步指令
      python manage.py makemigrations
      python manage.py migrate

    (二)、先向mysql数据库中添加几条数据

    注:在存时间的时候,可能会发成跨时区的问题,发现时间晚了8小时,也就是自己存的时间的时候被修改成了UTC时间,就会出现这种情况,这个时候只需要修改一下settings中的配置就行了

    # USE_TZ = True  默认的配置是True,改成False 
    
    USE_TZ = False  
    

    往数据库中添加数据时,有以下三种方式:

    • 先在urls中配置好一个路径,然后在views中建立一个对应的函数,写插入数据的逻辑;(但是这种方法需要先访问页面,才能插入数据,比较麻烦)

    • 找到下方Django Console,直接写逻辑,不用访问页面,就直接往数据库插入数据了(这样需要敲一句执行一句,也很麻烦)

    • 通过外部文件使用models
      任意路径下创建一个py文件,比如ins_book.py
      # 外部文件使用Django的models需要配置Django环境
      import os

      if __name__ == '__main__':
          os.environ.setdefault("DJANGO_SETTINGS_MODULE", "library_pro.settings")  # manage.py中有,表示加载Django环境
          import django
          django.setup()  # 启动django环境
      
          from app01 import models
          models.MyLibrary.objects.create(book_name='九阴真经', price='99.00', pub_date='2012-11-11', publish='华山')
          models.MyLibrary.objects.create(book_name='太极拳', price='188.00', pub_date='2018-04-25', publish='武当')
          models.MyLibrary.objects.create(book_name='打狗棍法', price='888.00', pub_date='2019-12-12', publish='丐帮')
          models.MyLibrary.objects.create(book_name='七伤拳', price='55.00', pub_date='1999-05-14', publish='崆峒')
          models.MyLibrary.objects.create(book_name='龙爪手', price='777.00', pub_date='1988-07-17', publish='少林')
          models.MyLibrary.objects.create(book_name='乾坤大挪移', price='55.00', pub_date='1777-11-14', publish='明教')
      

      这样直接执行这个py文件,就可以把数据直接插入mysql数据库当中了,不需要打开网页访问

    (三)、制作查看所有书籍页面

    1. 引入bookstrap静态文件
      # 在settings中:
      STATICFILES_DIRS = [
      os.path.join(BASE_DIR,'statics')
      ]

    2. 配置路径
      # urls中:
      url(r'^mylibrary/', views.mylibrary,name='allbooks') # name起别名

    3. 创建一个all_book.html,目的是展示所有的书籍
      {% load static %}






      图书管理系统

      </head>
      <body>
      
      
      <div class="container">
          <div class="panel panel-default">
              <div class="panel-heading">查看书籍</div>
              <div class="panel-body">
                  <form class="form-inline" method="post">
                      <div class="form-group">
                          <label class="sr-only" for="exampleInputAmount">Amount (in dollars)</label>
                          <div class="input-group">
                              <input type="text" class="form-control" id="exampleInputAmount" placeholder="搜索">
                          </div>
                      </div>
                      <button type="submit" class="btn btn-primary">搜索</button>
                      <p class="text-right pull-right" >
                          <a href="{% url 'addbooks' %}" class="btn btn-primary">添加</a>
                      </p>
      
                      <table class="table table-bordered table-striped">
                      <thead>
                      <tr>
                          <th>编号</th>
                          <th>书籍名称</th>
                          <th>价格</th>
                          <th>出版日期</th>
                          <th>出版社</th>
                          <th>操作</th>
                      </tr>
                      </thead>
                      <tbody>
                      {% for book in book_list %}
                          <tr>
                              <td>{{ forloop.counter }}</td>
                              <td>{{ book.book_name }}</td>
                              <td>{{ book.price }}</td>
                              <td>{{ book.pub_date|date:'Y-m-d' }}</td>
                              <td>{{ book.publish }}</td>
      
                              <td>
                                  <p class="text-center">
                                      <a href="{% url 'alter
                                      books' book.id %}" class="btn btn-warning btn-sm glyphicon glyphicon-pencil">编辑</a>
                                      <a href="{% url 'delbooks' book.id %}" class="btn btn-danger btn-sm glyphicon glyphicon-remove">删除</a>
                                  </p>
                              </td>
                          </tr>
                      {% endfor %}
      
                      </tbody>
      
                  </table>
                  </form>
                  <div class="pull-right">
                      <nav aria-label="Page navigation">
                          <ul class="pagination">
                              <li>
                                  <a href="#" aria-label="Previous">
                                      <span aria-hidden="true">&laquo;</span>
                                  </a>
                              </li>
                              <li><a href="#">1</a></li>
                              <li><a href="#">2</a></li>
                              <li><a href="#">3</a></li>
                              <li><a href="#">4</a></li>
                              <li><a href="#">5</a></li>
                              <li>
                                  <a href="#" aria-label="Next">
                                      <span aria-hidden="true">&raquo;</span>
                                  </a>
                              </li>
                          </ul>
                      </nav>
                  </div>
      
      
              </div>
          </div>
      </div>
      
      </body>
      </html>
      
    4. 写views对应的函数,写入相关逻辑
      def mylibrary(request):

          # 查所有的数据
          all_obj = models.MyLibrary.objects.all()
          return render(request,'all_book.html',{'book_list':all_obj})
      

    (四)、制作添加书籍页面

    1. 制作添加页面的html文件,比如叫 addbook.html文件
      {% load static %}

      <!DOCTYPE html>
      <html lang="zh-CN">
      <head>
          <meta charset="utf-8">
          <title>Library</title>
          <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dit/css/bootstrap.css' %}">
      
      </head>
      <body>
      <div class="container">
          <div class="panel panel-default">
              <div class="panel-heading">           
                      添加书籍
              </div>
              <div class="panel-body">
                  <div class="row">
                      <form class="col-md-8 col-sm-offset-2" method="post" action="">
                          {% csrf_token %} 
                          <div class="form-group">
                              <label for="exampleInputbook-name">书籍名称</label>
                                  <input type="text" class="form-control" id="exampleInputbook-name" placeholder="book-name" name="book_name">
                          </div>
                          <div class="form-group">
                              <label for="exampleInputbook-price">价格</label>
                                  <input type="number" class="form-control" id="exampleInputbook-price" placeholder="book-price" name="price">
                          </div>
                          <div class="form-group">
                              <label for="exampleInputpub-date">出版日期</label>
                                  <input type="date" class="form-control" id="exampleInputpub-date" placeholder="pub-date" name="pub_date">
                          </div>
                          <div class="form-group">
                              <label for="exampleInputpublish">出版社</label>
                                  <input type="text" class="form-control" id="exampleInputpublish" placeholder="publish" name="publish">
                          </div>
      
                          <button type="submit" id="b1" class="btn btn-success pull-right">Submit</button>
                      </form>
                  </div>
              </div>
          </div>
      </div>
      
      
      </body>
      </html>
      
    2. 配置urls、views
      url(r'^addbook/', views.addbook,name='addbooks'),

      from django.urls import reverse
      
      def addbook(request):
          if request.method == 'GET':
              return render(request, 'addbook.html')
          else:
              book_name = request.POST.get('book_name')
              price = request.POST.get('price')
              pub_date = request.POST.get('pub_date')
              publish = request.POST.get('publish')
              models.MyLibrary.objects.create(book_name=book_name ,price=price ,pub_date=pub_date ,publish=publish )
          # return redirect('/mylibrary/')
          return redirect(reverse('allbooks'))  # 别名反向解析reverse('别名')
      
    3. 关联好all_book.html中添加的那个按钮:
      添加

    4. 此时,在我们测试提交日期的时候,又会出现问题:

      因为我们设置的价格input框的text属性是number,而这个提示是浏览器对数据的限制,此时我们可以去掉这个限制
      在form表单中,这个form添加 novalidate 这个属性:

    (五)、制作删除书籍页面

    1. 配置urls、views
      url(r'^delbook/', views.delbook , name='delbooks'),

      def delbook(request,book_id):
          models.MyLibrary.objects.get(id=book_id).delete()
          return redirect(reverse('allbooks'))
      
    2. 关联好all_book.html中删除的那个按钮:
      删除

    3. 测试删除的功能,理论上应该已经实现了

    (五)、制作编辑书籍页面

    1. 配置urls、views
      url(r'^alterbook/(d+)/', views.alterbook , name='alterbooks'),

      def alterbook(request,book_id):
          if request.method == 'GET':
              try:
                  book_msg = models.MyLibrary.objects.get(id=book_id)
              except Exception:
                  return HttpResponse('别瞎鸡儿改!!!')
              return render(request,'alterbook.html',{'book_msg':book_msg})
          else:
              book_name = request.POST.get('book_name')
              price = request.POST.get('price')
              pub_date = request.POST.get('pub_date')
              publish = request.POST.get('publish')
              models.MyLibrary.objects.filter(id=book_id).update(book_name=book_name ,price=price ,pub_date=pub_date,publish=publish )
              return redirect(reverse('allbooks'))
      
    2. 关联好all_book.html中编辑的那个按钮:
      编辑

    3. 制作编辑的html页面,比如 alterbook.html文件
      {% load static %}

      <!DOCTYPE html>
      <html lang="zh-CN">
      <head>
          <meta charset="utf-8">
          <title>Library</title>
          <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dit/css/bootstrap.css' %}">
          <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dit/fonts' %}">
      
      </head>
      <body>
      <div class="container">
          <div class="panel panel-default">
              <div class="panel-heading">
                  {% block title %}
                      修改书籍
                  {% endblock title %}
              </div>
              <div class="panel-body">
                  <div class="row">
                      <form class="col-md-8 col-sm-offset-2" method="post" action="" novalidate>
                      	{% csrf_token %} 
                          <div class="form-group">
                              <label for="exampleInputbook-name">书籍名称</label>
                                  <input type="text" class="form-control" id="exampleInputbook-name" value="{{ book_msg.book_name }}" name="book_name">
                          </div>
                          <div class="form-group">
                              <label for="exampleInputbook-price">价格</label>
                                  <input type="number" class="form-control" id="exampleInputbook-price" value="{{ book_msg.price }}" name="price">
                          </div>
                          <div class="form-group">
                              <label for="exampleInputpub-date">出版日期</label>
                                  <input type="date" class="form-control" id="exampleInputpub-date" value="{{ book_msg.pub_date|date:'Y-m-d'}}" name="pub_date">
                          </div>
                          <div class="form-group">
                              <label for="exampleInputpublish">出版社</label>
                                  <input type="text" class="form-control" id="exampleInputpublish" value="{{ book_msg.publish }}" name="publish">
                          </div>
      
                          <button type="submit" id="b1" class="btn btn-success pull-right">Submit</button>
                      </form>
                  </div>
              </div>
          </div>
      </div>
      
      
      <script src="{% static 'jQuery.js' %}"></script>
      <script src="{% static 'bootstrap-3.3.7-dit/js/bootstrap.min.js' %}"></script>
      
      </body>
      </html>
      
    4. 测试功能

  • 相关阅读:
    CODEVS——T 2618 核电站问题
    Spring使用AspectJ注解和XML配置实现AOP
    oracle存储过程
    oracle什么时候需要commit
    短信发送接口被恶意访问
    JAVA内存模型
    构造函数,静态代码块,构造代码块
    mybatis缓存
    volatile和synchronized
    利用反射创建对象必须要显式的声明构造方法吗?
  • 原文地址:https://www.cnblogs.com/yangzm/p/11234576.html
Copyright © 2011-2022 走看看