08- 图书管理系统

1

model

from django.db import models

# Create your models here.


class Book(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    pub_date = models.DateField()
    price = models.DecimalField(max_digits=8, decimal_places=2)
    publish = models.CharField(max_length=32)

数据迁移

python manage.py makemigrations

python manage.py migrate

 

建立static文件夹,导入bootstrap

关键的文件是dist文件夹

 

静态文件配置

STATIC_URL = '/static/'

# 把静态目录static,添加到BASE_DIR
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

2、添加书籍

主url

from django.contrib import admin
from django.urls import path, re_path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^app01/', include(('app01.urls', 'app01')))
]

app01 url

from django.urls import path, re_path, include
from app01 import views

urlpatterns = [
    re_path(r'^addbook', views.addbook, name='addbook')
]

view

from django.shortcuts import render, HttpResponse

# Create your views here.
from app01.models import Book


def addbook(request):
    # 1. post方式提交form表单
    if request.method == 'POST':
        # 1.1 得到form表单的数据 k:V
        title = request.POST.get('title')
        price = request.POST.get('price')
        pub_date = request.POST.get('pub_date')
        publish = request.POST.get('publish')

        # 1.2 Book中添加数据
        Book.objects.create(
            title=title,
            price=price,
            pub_date=pub_date,
            publish=publish,
        )

        return HttpResponse('添加成功')

    # 2. get方式得到html网页
    return render(request, 'app01/addbook.html')

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加书籍</title>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.css">
    <style type="text/css">
        .container{
            margin-top: 100px;
        }
        .btn{
            margin-top: 10px;
        }

    </style>
</head>
<body>
<h1>添加书籍</h1>
<div class="container">
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <form action="" method="post">
                {% csrf_token %}
                <div>
                    <label for="">书籍名称</label>
                    <input type="text" class="form-control" name="title"/>
                </div>
                <div>
                    <label for="">价格</label>
                    <input type="text" class="form-control" name="price"/>
                </div>
                <div>
                    <label for="">出版日期</label>
                    <input type="date" class="form-control" name="pub_date"/>
                </div>
                <div>
                    <label for="">出版社</label>
                    <input type="text" class="form-control" name="publish"/>
                </div>
                <input type="submit" class="btn btn-success pull-right">
            </form>
        </div>
    </div>
</div>

</body>
</html>

input的  k:v  key要对应modles中Book的字段

form-control 类 标签更加格式化

col-md-offset-3 类  标签向右移动3格

 pull-right 类  标签靠右

 btn-success 绿色

<input type="submit" class="btn btn-success ">
<input type="submit" class="btn btn-success pull-right">

 

 

添加书籍时,data为空的话,会报错

3、查看书籍

url

from django.urls import path, re_path, include
from app01 import views

urlpatterns = [
    re_path(r'^addbook', views.addbook, name='addbook'),
    re_path(r'^book', views.book, name='book')
]

view

from app01.models import Book
def book(request):

    # 获取所有的书籍对象
    book_list = Book.objects.all()  # [obj1,obj2,...]

    return render(request, './app01/book.html', {'book_list': book_list})

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加书籍</title>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.css">
    <style type="text/css">
        .container {
            margin-top: 100px;
        }

        .btn {
            margin-top: 10px;
        }

    </style>
</head>
<body>
<h1>查看书籍</h1>
<div class="container">
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <table class="table table-bordered table-striped">
                <thead>
                    <tr>
                        <th>书籍名称</th>
                        <th>价格</th>
                        <th>出版日期</th>
                        <th>出版社</th>
                    </tr>
                </thead>
                <tbody>
                    {% for book in book_list %}
                        <tr>
                            <td>{{ book.title }}</td>
                            <td>{{ book.price }}</td>
{#                            <td>{{ book.pub_date }}</td>  July 1, 2018 #}
                            <td>{{ book.pub_date|date:'Y-m-d' }}</td>
                            <td>{{ book.publish }}</td>
                        </tr>
                    {% endfor %}
                </tbody>
            </table>

        </div>
    </div>
</div>

</body>
</html>
<table class="table">

<table class="table table-bordered">  边框

<table class="table table-bordered table-striped">  斑马线

4、删除书籍

删除

url

from django.urls import path, re_path, include
from app01 import views

urlpatterns = [
    re_path(r'^addbook/$', views.addbook, name='addbook'),
    re_path(r'^book/$', views.book, name='book'),
    re_path(r'^book/(d+)/delete/$', views.delete, name='delete'),   # views.delete(request, 2)
]

views

def delete(request, id):
    Book.objects.filter(id=id).delete()
    return redirect('/app01/book/')    # 重定向到/app01/book/的url

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>查看书籍</title>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.css">
    <style type="text/css">
        .container {
            margin-top: 100px;
        }

        .btn {
            margin: 10px auto;
        }

    </style>
</head>
<body>
<h1>查看书籍</h1>
<div class="container">
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <a href="/app01/addbook/" class="btn btn-primary">添加书籍</a>
            <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>{{ book.title }}</td>
                        <td>{{ book.price }}</td>
                        {#                            <td>{{ book.pub_date }}</td>  July 1, 2018 #}
                        <td>{{ book.pub_date|date:'Y-m-d' }}</td>
                        <td>{{ book.publish }}</td>
                        <td><a href="" class="btn btn-info">编辑</a></td>
{#                        <td><a href="/app01/book/{{ book.id }}/delete/" class="btn btn-danger">删除</a></td>#}
                        <td><a href="/app01/book/{{ book.pk }}/delete/" class="btn btn-danger">删除</a></td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>

        </div>
    </div>
</div>

</body>
</html>
{{ book.pk }} 比{{ book.id }}更加灵活

    

  <a href="/app01/addbook/" class="btn btn-primary">添加书籍</a>
redirect重定向

 

 

 

 

 5、编辑书籍

url

from django.urls import path, re_path, include
from app01 import views

urlpatterns = [
    re_path(r'^addbook/$', views.addbook, name='addbook'),
    re_path(r'^book/$', views.book, name='book'),
    re_path(r'^book/(d+)/delete/$', views.delete, name='delete'),   # views.delete(request, 2)
    re_path(r'^book/(d+)/edit/$', views.edit, name='edit'),   # views.delete(request, 2)
]

view

def edit(request, id):
    if request.method == 'POST':
        title = request.POST.get('title')
        price = request.POST.get('price')
        pub_date = request.POST.get('pub_date')
        publish = request.POST.get('publish')

        Book.objects.filter(id=id).update(
            title=title,
            price=price,
            pub_date=pub_date,
            publish=publish,
        )
        return redirect('/app01/book/')

    # ret1 = Book.objects.filter(id=id)   # <QuerySet [<Book: Book object (4)>]>
    book_obj = Book.objects.filter(id=id).first()  # Book object (4)

    return render(request, './app01/editbook.html', {'book_obj': book_obj})

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>编辑书籍</title>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.css">
    <style type="text/css">
        .container{
            margin-top: 100px;
        }
        .btn{
            margin-top: 10px;
        }

    </style>
</head>
<body>
<h1>编辑书籍</h1>
<div class="container">
    <div class="row">
        <div class="col-md-6 col-md-offset-3">

            <form action="" method="post">
                {% csrf_token %}
                <div>
                    <label for="">书籍名称</label>
                    <input type="text" class="form-control" name="title" value={{ book_obj.title }}>
                </div>
                <div>
                    <label for="">价格</label>
                    <input type="text" class="form-control" name="price" value={{ book_obj.price }}>
                </div>
                <div>
                    <label for="">出版日期</label>
{#                    <input type="date" class="form-control" name="pub_date" value={{ book_obj.pub_date }}/>#}
                    <input type="date" class="form-control" name="pub_date" value={{ book_obj.pub_date|date:'Y-m-d' }}>
                </div>
                <div>
                    <label for="">出版社</label>
                    <input type="text" class="form-control" name="publish" value={{ book_obj.publish }}>
                </div>
                <input type="submit" class="btn btn-success pull-right">
            </form>
        </div>
    </div>
</div>

</body>
</html>

日期需要格式化

 

6、查询操作

def query(request):

    # 1. 查询老男孩出版社出版过的价格大于200的书籍
    ret1 = Book.objects.filter(publish='老男孩出版社', price__gt=200)
    print(ret1)

    # 2. 查询2018年8月出版的所有以py开头的书籍名称
    # ret2 = Book.objects.filter(pub_date='2017-08', title__startswith='py')    错误用法
    # ret2 = Book.objects.filter(pub_date__year=2017, pub_date__month=08, title__startswith='py')   错误用法
    ret2 = Book.objects.filter(pub_date__year='2018', pub_date__month='07', title__startswith='py')
    ret2 = Book.objects.filter(pub_date__year=2018, pub_date__month=7, title__startswith='p').values('title')
    ret2 = Book.objects.filter(pub_date__year=2018, pub_date__month=7, title__startswith='p')

    print(ret2)


    # 3. 查询价格为50, 100或者150的所有书籍名称及其出版社名称
    ret1 = Book.objects.filter(price__in=[22,300,200])
    print(ret1)    # <QuerySet [<Book: 红楼梦>, <Book: python全栈之路>, <Book: php>]>

    ret2 = Book.objects.filter(price__in=[22,300,200]).values('title', 'publish')
    print(ret2)
    # <QuerySet [{'title': '红楼梦', 'publish': '人民出版社'},
                # {'title': 'python全栈之路', 'publish': '老男孩出版社'},
                # {'title': 'php', 'publish': '老男孩出版社'}]>



    # 4. 查询价格在100到200之间的所有书籍名称及其价格
    ret1 = Book.objects.filter(price__range=[100,200]).values('title', 'price')
    print(ret1)   # <QuerySet [{'title': 'php', 'price': Decimal('200.00')}]>

    # 5. 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)
    ret1 = Book.objects.filter(publish='人民出版社').values('title','price').distinct().order_by('-price')
    print(ret1)   # <QuerySet [{'title': '水浒传222', 'price': Decimal('333.00')}, {'title': '红楼梦', 'price': Decimal('22.00')}]>

    return HttpResponse('查询成功')

 

 

 

总结 :日期查询

# 都可以  
  ret2 = Book.objects.filter(pub_date__year='2018', pub_date__month='07', title__startswith='py')

  ret2 = Book.objects.filter(pub_date__year=2018, pub_date__month=7, title__startswith='p')

7、pycharm自带database配置

5

原文地址:https://www.cnblogs.com/venicid/p/9256677.html