练习: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 %}






    图书管理系统




    查看书籍











    添加













    {% for book in book_list %}






    编号 书籍名称 价格 出版日期 出版社 操作
    {{ forloop.counter }} {{ book.book_name }} {{ book.price }} {{ book.pub_date|date:'Y-m-d' }} {{ book.publish }}


    编辑
    删除







  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文件





    Library






    添加书籍




    {% csrf_token %}





















  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文件





    Library






    {% block title %}
    修改书籍
    {% endblock title %}




    {% csrf_token %}






















  4. 测试功能

posted on 2019-07-23 21:25  雨后清明  阅读(1423)  评论(1)    收藏  举报

导航