创建项目
django-admin startproject mysite3
创建应用bookstore
python manage.py startapp bookstore
修改settings.py文件(自行百度)
修改你mysite3文件夹下的urls文件,实现路由分流
![](https://i-blog.csdnimg.cn/blog_migrate/e26c9a84d490e478ba8c3f617e0581de.png)
在bookstore文件下新建urls.py文件
from django.urls import path,include
from bookstore import views
urlpatterns = [
]
在修改bookstore文件夹下的models文件
from django.db import models
# Create your models here.
class Book(models.Model):
title = models.CharField('书名',max_length=50,default='',unique=True)
pub = models.CharField('出版社',max_length=100,default='')
price = models.DecimalField('价格',max_digits=7,decimal_places=2)
market_price = models.DecimalField('零售价',max_digits=7,decimal_places=2,default=0.0)
active = models.BooleanField('是否活跃',default=True)
class Mete:
db_table = 'book'
def __str__(self):
return '%s %s %s %s'%(self.title,self.pub,self.price,self.market_price)
在本地mysql创建数据库
执行数据迁移
python manage.py makemigrations
python manage.py migrate
在bookstore/views文件下增加测试函数
from django.http import HttpResponse
def index(request):
return HttpResponse("this is bookstore")
在bookstore/urls文件下新增路由
from django.urls import path,include
from bookstore import views
urlpatterns = [
path('index',views.index),
]
运行项目,访问bookstore/index页面
python manage.py runserver
![](https://i-blog.csdnimg.cn/blog_migrate/1aed168510707fd9f8c963d31905edd3.png)
功能一、展示全部数据
修改urls文件,新增路由展示全部数据
from django.urls import path,include
from bookstore import views
urlpatterns = [
path('index',views.index),
path('all_book',views.all_book),
]
在views文件中新建函数all_book
def all_book(request):
books = Book.objects.filter(active=True)# active=True表示该数据没有被伪删除
return render(request,'all_book.html',locals()) #locals()表示,把books对象转成字典形式,传递给all_book.html页面
在bookstore文件下下新建templates文件夹 在该文件夹下新建all_boook.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>查看所有书籍页面</title>
</head>
<body>
<table border="1">
<tr>
<th>id</th>
<th>title</th>
<th>pub</th>
<th>price</th>
<th>market_price</th>
<th>op</th>
</tr>
{% for book in books %}
<!-- 循环遍历books字典 该字典是views文件中all_book()函数传进来的值-->
<tr>
<td>{{ book.id }}</td>
<td>{{ book.title }}</td>
<td>{{ book.pub }}</td>
<td>{{ book.price }}</td>
<td>{{ book.market_price }}</td>
<td>
<a href="">更新</a>
<a href="">删除</a>
</td>
</tr>
{% endfor %}
</table>
</body>
</html>
访问bookstore/all_book
![](https://i-blog.csdnimg.cn/blog_migrate/9550c019e78da1a189e6bd9d4453b22f.png)
功能二、更新操作
在上方的all_boook.html文件中,添加更新操作的链接(注意该链接是绝对路径,相对路径可能会出错)
![](https://i-blog.csdnimg.cn/blog_migrate/3b9c90a4f5b85f2b169385fc6fb394fd.png)
在urls文件里新增更新路由
path('updata_book/<int:id>',views.updata_book),
![](https://i-blog.csdnimg.cn/blog_migrate/7f6ccf7052732b516a6311cb68cccf38.png)
在views文件里新增更新函数updata_book()
def updata_book(request,id):
try:
book = Book.objects.get(id=id) # 第一个id表示Book类型数据的id字段 第二个id表示传入的参数id
# 这里一定要用try except包含 防止没有获得唯一数据报错
except:
HttpResponse('the book is not exits')
if request.method=='GET': #在all_boook.html页面中,点击更新操作后,会执行GET请求
return render(request, 'updata_book.html', locals())
else:
book.price=request.POST['price'] # 更新数据
book.market_price=request.POST['market_price']
book.save()
return HttpResponseRedirect('/bookstore/all_book') #重定向
# 这里也是绝对路径
新建templates/updata_book.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>更新书籍信息</title>
</head>
<body>
<!-- action="/bookstore/updata_book/{{book.id}} 注意是绝对路径-->
<form action="/bookstore/updata_book/{{book.id}}" method="POST">
{% csrf_token %}
<!-- 解决跨站请求的问题-->
<p>
title<input type="text" value="{{book.title}}" disabled>
<!-- disabled 表示 不可被修改-->
</p>
<p>
pub<input value={{book.pub}} type="text" disabled>
</p>
<p>
price<input value={{book.price}} type="text" name="price">
</p>
<p>
market_price<input value={{book.market_price}} type="text" name="market_price">
</p>
<p>
<input type="submit" value="更新">
</p>
</form>
</body>
</html>
执行过程
![](https://i-blog.csdnimg.cn/blog_migrate/e1f3e1704532819ce26ddc55936b33ec.png)
功能三、删除操作
在all_book.html页面添加删除链接
![](https://i-blog.csdnimg.cn/blog_migrate/460c3727dd51050836bd96b564806226.png)
在urls文件中新增删除路由
![](https://i-blog.csdnimg.cn/blog_migrate/56db6c91ef0e4f88b7dc283e369c73a7.png)
在views.py文件中新增删除函数
def delete_book(request,id):
try:
book = Book.objects.get(id=id,active=True)
except:
HttpResponse('delete_book error')
book.active=False # 这里用了伪删除的方法,只是把该条数据标记为不活跃,没有真正删除
book.save()
return HttpResponseRedirect('/bookstore/all_book')
删除过程
![](https://i-blog.csdnimg.cn/blog_migrate/e16a859a691d46b369c37da2da5fb180.png)