09 django模型层_单表练习
模型层(单表练习)
图书管理系统:
实现功能:book单表的增删改查
查询操作练习:
1
查询人民出版社出版过的价格大于
200
的书籍
2
查询
2017
年
8
月出版的所有以py开头的书籍名称
3
查询价格为
50
,
100
或者
150
的所有书籍名称及其出版社名
4
查询价格在
100
到
200
之间的所有书籍名称及其价格
5
查询所有人民出版社出版的书籍的价格(从高到低排序,去重)
效果:
目录结构:
06 django模型层\book\book\settings.py
1 """ 2 Django settings for book project. 3 4 Generated by 'django-admin startproject' using Django 2.2.3. 5 6 For more information on this file, see 7 https://docs.djangoproject.com/en/2.2/topics/settings/ 8 9 For the full list of settings and their values, see 10 https://docs.djangoproject.com/en/2.2/ref/settings/ 11 """ 12 13 import os 14 15 # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 18 19 # Quick-start development settings - unsuitable for production 20 # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ 21 22 # SECURITY WARNING: keep the secret key used in production secret! 23 SECRET_KEY = 'cex-c#ja^@=p_dp#ak0-@=^ws!_-f6g#*52jb5!3%xhe4!dc^*' 24 25 # SECURITY WARNING: don't run with debug turned on in production! 26 DEBUG = True 27 28 ALLOWED_HOSTS = [] 29 30 31 # Application definition 32 33 INSTALLED_APPS = [ 34 'django.contrib.admin', 35 'django.contrib.auth', 36 'django.contrib.contenttypes', 37 'django.contrib.sessions', 38 'django.contrib.messages', 39 'django.contrib.staticfiles', 40 # 'book_app01.apps.BookApp01Config', 41 'book_app01', 42 ] 43 44 MIDDLEWARE = [ 45 'django.middleware.security.SecurityMiddleware', 46 'django.contrib.sessions.middleware.SessionMiddleware', 47 'django.middleware.common.CommonMiddleware', 48 'django.middleware.csrf.CsrfViewMiddleware', 49 'django.contrib.auth.middleware.AuthenticationMiddleware', 50 'django.contrib.messages.middleware.MessageMiddleware', 51 'django.middleware.clickjacking.XFrameOptionsMiddleware', 52 ] 53 54 ROOT_URLCONF = 'book.urls' 55 56 TEMPLATES = [ 57 { 58 'BACKEND': 'django.template.backends.django.DjangoTemplates', 59 'DIRS': [os.path.join(BASE_DIR, 'templates')], 60 'APP_DIRS': True, 61 'OPTIONS': { 62 'context_processors': [ 63 'django.template.context_processors.debug', 64 'django.template.context_processors.request', 65 'django.contrib.auth.context_processors.auth', 66 'django.contrib.messages.context_processors.messages', 67 ], 68 }, 69 }, 70 ] 71 72 WSGI_APPLICATION = 'book.wsgi.application' 73 74 75 # Database 76 # https://docs.djangoproject.com/en/2.2/ref/settings/#databases 77 78 # DATABASES = { 79 # 'default': { 80 # 'ENGINE': 'django.db.backends.sqlite3', 81 # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 82 # } 83 # } 84 85 86 # Password validation 87 # https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators 88 89 AUTH_PASSWORD_VALIDATORS = [ 90 { 91 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 92 }, 93 { 94 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 95 }, 96 { 97 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 98 }, 99 { 100 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 101 }, 102 ] 103 104 105 # Internationalization 106 # https://docs.djangoproject.com/en/2.2/topics/i18n/ 107 108 LANGUAGE_CODE = 'en-us' 109 110 TIME_ZONE = 'UTC' 111 112 USE_I18N = True 113 114 USE_L10N = True 115 116 USE_TZ = True 117 118 119 # Static files (CSS, JavaScript, Images) 120 # https://docs.djangoproject.com/en/2.2/howto/static-files/ 121 122 STATIC_URL = '/static/' 123 124 STATICFILES_DIRS = [ 125 os.path.join(BASE_DIR, 'statics') 126 ] 127 DATABASES = { 128 'default': { 129 'ENGINE': 'django.db.backends.mysql', 130 'NAME':'orm',# 要连接的数据库,连接前需要创建好 131 'USER':'root',# 连接数据库的用户名 132 'PASSWORD':'root',# 连接数据库的密码 133 'HOST':'127.0.0.1',# 连接主机,默认本级 134 'PORT':3306 # 端口 默认3306 135 } 136 } 137 138 LOGGING = { 139 'version': 1, 140 'disable_existing_loggers': False, 141 'handlers': { 142 'console':{ 143 'level':'DEBUG', 144 'class':'logging.StreamHandler', 145 }, 146 }, 147 'loggers': { 148 'django.db.backends': { 149 'handlers': ['console'], 150 'propagate': True, 151 'level':'DEBUG', 152 }, 153 } 154 }
06 django模型层\book\book\__init__.py
import pymysql pymysql.install_as_MySQLdb()
06 django模型层\book\book\urls.py
from django.contrib import admin from django.urls import path,re_path,include urlpatterns = [ path('admin/', admin.site.urls), re_path('^app01/', include(('book_app01.urls','book_app01'))), ]
06 django模型层\book\book_app01\models.py
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,unique=True) state = models.BooleanField() pub_date = models.DateField() price=models.DecimalField(max_digits=8,decimal_places=2) publish=models.CharField(max_length=32) def __str__(self): return self.title
06 django模型层\book\book_app01\urls.py
from django.urls import path,re_path,include from book_app01 import views urlpatterns = [ path('book/', views.book), path('book/add', views.add_book), re_path(r'book/(\d+)/update', views.update_book), re_path(r'book/(\d+)/delete', views.delete_book), ]
06 django模型层\book\book_app01\views.py
1 from django.shortcuts import render,redirect 2 from book_app01.models import Book 3 4 # Create your views here. 5 6 7 def book(request): 8 method = request.method 9 req = request.POST if request.POST else request.GET 10 try: 11 title = req.get('title') if req.get('title') else '' 12 except: 13 title = '' 14 book_list = Book.objects.filter(title__contains=title) 15 ''' 16 # 1 查询人民出版社出版过的价格大于200的书籍 17 res = Book.objects.filter(publish="人民出版社",price__gt=200) 18 # 2 查询2017年8月出版的所有以py开头的书籍名称 19 res = Book.objects.filter(pub_date__contains="2017-08",title__startswith='py').values('title') 20 # 3 查询价格为50,100或者150的所有书籍名称及其出版社名 21 res = Book.objects.filter(price__in=[50,100,150]).values('title','publish') 22 # 4 查询价格在100到200之间的所有书籍名称及其价格 23 res = Book.objects.filter(price__range=[100,200]).values('title','price') 24 # 5 查询所有人民出版社出版的书籍的价格(从高到低排序,去重) 25 res = Book.objects.filter(publish="人民出版社").values('price').distinct().order_by('-price') 26 print('res----------->',res) 27 ''' 28 return render(request, 'book.html',locals()) 29 30 31 def add_book(request): 32 method = request.method 33 if method == 'POST': 34 req = request.POST 35 title = req['title'].strip() 36 price = req['price'].strip() 37 date = req['date'].strip() 38 publish = req['publish'].strip() 39 if title and price and date and publish: 40 selct_res = Book.objects.filter(title=title) 41 if not selct_res: 42 Book.objects.create(title=title,price=price,pub_date=date,publish=publish) 43 return redirect('/app01/book') 44 opt_res = '书籍【%s】已存在,请修改后提交!'%title 45 else: 46 opt_res = '输入不能为空,请修改后提交!' 47 return render(request, 'addbook.html', locals()) 48 49 50 def update_book(request, num): 51 select_res = Book.objects.filter(id=num) 52 if select_res: 53 method = request.method 54 book_obj = select_res[0] 55 if method == 'POST': 56 req = request.POST 57 title = req['title'].strip() 58 price = req['price'].strip() 59 date = req['date'].strip() 60 publish = req['publish'].strip() 61 if title and price and date and publish: 62 selct_res = Book.objects.exclude(id=num).filter(title=title) 63 if not selct_res: 64 Book.objects.filter(id=num).update(title=title, price=price, pub_date=date, publish=publish) 65 return redirect('/app01/book') 66 opt_res = '书籍【%s】已存在,请修改后提交!' % selct_res[0].title 67 else: 68 opt_res = '输入不能为空,请修改后提交!' 69 return render(request, 'updatebook.html', locals()) 70 return redirect('/app01/book') 71 72 def delete_book(request, num=None): 73 select_res = Book.objects.filter(id=num) 74 if select_res: 75 Book.objects.filter(id=num).delete() 76 return redirect('/app01/book')
06 django模型层\book\templates\advertise.html
1 <div class="action"> 2 <div class="panel panel-danger"> 3 <div class="panel-heading">2019进击的菜鸟</div> 4 <div class="panel-body"> 5 web框架开发 6 </div> 7 <div class="panel-body"> 8 crm&爬虫 9 </div> 10 <div class="panel-body"> 11 算法&设计模式&企业应用 12 </div> 13 <div class="panel-body"> 14 vue项目 15 </div> 16 <div class="panel-body"> 17 复习python&自动化&性能 18 </div> 19 </div> 20 <div class="panel panel-warning"> 21 <div class="panel-heading">2020进击的小鸟</div> 22 <div class="panel-body"> 23 fighting! 24 </div> 25 </div> 26 <div class="panel panel-success"> 27 <div class="panel-heading">2021进击的大鸟</div> 28 <div class="panel-body"> 29 go on ! 30 </div> 31 </div> 32 </div>
06 django模型层\book\templates\base.html
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 {% block title %} 6 <title>base——title</title> 7 {% endblock title %} 8 <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" 9 integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> 10 {% block style %} 11 <style type="text/css"> 12 *{ 13 padding: 0; 14 margin:0; 15 } 16 .header{ 17 width:100%; 18 height: 50px; 19 background-color: #369; 20 } 21 body{ 22 background:#FFF url('/static/base.jpg') repeat-x 0; 23 background-attachment: fixed; 24 } 25 </style> 26 {% endblock style %} 27 28 </head> 29 <body> 30 31 <div class="header"></div> 32 33 <div class="container"> 34 <div class="row"> 35 <div class="col-md-3"> 36 {% include 'advertise.html' %} 37 </div> 38 <div class="col-md-9"> 39 {% block content%} 40 <h3>base_content</h3> 41 {% endblock %} 42 </div> 43 </div> 44 </div> 45 46 </body> 47 {% block js %} 48 <script type="text/javascript" src="/static/jquery-3.3.1.js"></script> 49 {% endblock js %} 50 </html>
06 django模型层\book\templates\book.html
1 {% extends 'base.html' %} 2 3 {% block style %} 4 {{ block.super }} 5 <style> 6 .mybook { 7 margin-top: 40px; 8 } 9 10 .btn { 11 margin-top: 5px; 12 } 13 .other{ 14 margin-top: 5px; 15 } 16 .filter{ 17 margin-bottom: 30px; 18 } 19 .empty{ 20 text-align: center; 21 color: #D0D0D0; 22 } 23 </style> 24 {% endblock style %} 25 26 {% block title %} 27 <title>book</title> 28 {% endblock title %} 29 30 {% block content %} 31 <h3>查看书籍</h3> 32 33 <div class="container mybook"> 34 <div class="row"> 35 <div class="col-md-6"> 36 <form class="form-inline filter" action=""> 37 <div class="form-group"> 38 <div class="form-group other"> 39 <label for="">书籍名称</label> 40 <input type="text" class="form-control" placeholder="python" name="title"> 41 </div> 42 </div> 43 <button type="submit" class="btn btn-primary">查询</button> 44 </form> 45 <a href="/app01/book/add" class="btn btn-primary other">添加书籍</a> 46 <table class="table table-striped table-bordered"> 47 <thead> 48 <tr> 49 <th>书籍名称</th> 50 <th>价格</th> 51 <th>出版日期</th> 52 <th>出版社</th> 53 <th>删除操作</th> 54 <th>编辑操作</th> 55 </tr> 56 </thead> 57 <tbody> 58 {% for book in book_list %} 59 <tr> 60 <td>{{ book.title }}</td> 61 <td>{{ book.price }}</td> 62 <td>{{ book.pub_date|date:'Y-m-d' }}</td> 63 <td>{{ book.publish }}</td> 64 <td><a href="/app01/book/{{ book.pk }}/delete" class="btn btn-danger">删除</a></td> 65 <td><a href="/app01/book/{{ book.pk }}/update" class="btn btn-info">编辑</a></td> 66 </tr> 67 {% empty %} 68 <td class="empty" colspan="6">暂无数据!</td> 69 {% endfor %} 70 71 </tbody> 72 73 </table> 74 75 </div> 76 </div> 77 </div> 78 {% endblock content %}
06 django模型层\book\templates\addbook.html
1 {% extends 'base.html' %} 2 3 {% block style %} 4 {{ block.super }} 5 <style> 6 .mybook{ 7 margin-top: 50px; 8 } 9 .btn{ 10 margin-top: 10px; 11 } 12 .opt_res{ 13 margin-top: 50px; 14 color: red; 15 } 16 </style> 17 {% endblock style %} 18 19 {% block title %} 20 <title>book</title> 21 {% endblock title %} 22 23 {% block content %} 24 <h3>新增书籍</h3> 25 26 <div class="container mybook"> 27 <div class="row"> 28 <div class="col-md-6"> 29 <form action="" method="post"> 30 {% csrf_token %} 31 <div> 32 <label for="">书籍名称</label> 33 <input type="text" class="form-control" name="title" value={{ title }}> 34 </div> 35 <div> 36 <label for="">价格</label> 37 <input type="text" class="form-control" name="price" value={{ price }}> 38 </div> 39 <div> 40 <label for="">出版日期</label> 41 <input type="date" class="form-control" name="date" value={{ date }}> 42 </div> 43 <div> 44 <label for="">出版社</label> 45 <input type="text" class="form-control" name="publish" value={{ publish }}> 46 </div> 47 48 <input type="submit" class="btn btn-success pull-right"> 49 50 51 </form> 52 <p class="opt_res">{{ opt_res }}</p> 53 </div> 54 </div> 55 </div> 56 {% endblock content %}
06 django模型层\book\templates\updatebook.html
1 {% extends 'base.html' %} 2 3 {% block style %} 4 {{ block.super }} 5 <style> 6 .mybook{ 7 margin-top: 50px; 8 } 9 .btn{ 10 margin-top: 10px; 11 } 12 .opt_res{ 13 margin-top: 50px; 14 color: red; 15 } 16 </style> 17 {% endblock style %} 18 19 {% block title %} 20 <title>book</title> 21 {% endblock title %} 22 23 {% block content %} 24 <h3>修改书籍</h3> 25 26 <div class="container mybook"> 27 <div class="row"> 28 <div class="col-md-6"> 29 <form action="" method="post"> 30 {% csrf_token %} 31 <div> 32 <label for="">书籍名称</label> 33 <input type="text" class="form-control" name="title" value="{{ book_obj.title }}"> 34 </div> 35 <div> 36 <label for="">价格</label> 37 <input type="text" class="form-control" name="price" value="{{ book_obj.price }}"> 38 </div> 39 <div> 40 <label for="">出版日期</label> 41 <input type="date" class="form-control" name="date" value="{{ book_obj.pub_date|date:'Y-m-d' }}"> 42 </div> 43 <div> 44 <label for="">出版社</label> 45 <input type="text" class="form-control" name="publish" value="{{ book_obj.publish }}"> 46 </div> 47 48 <input type="submit" class="btn btn-success pull-right"> 49 50 51 </form> 52 <p class="opt_res">{{ opt_res }}</p> 53 </div> 54 </div> 55 </div> 56 {% endblock content %}
夕闻道不如朝闻道