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