创建项目
django-admin startproject mysite3
创建应用bookstore
python manage.py startapp bookstore
修改settings.py文件(自行百度)
修改你mysite3文件夹下的urls文件,实现路由分流
在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
功能一、展示全部数据
修改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
功能二、更新操作
在上方的all_boook.html文件中,添加更新操作的链接(注意该链接是绝对路径,相对路径可能会出错)
在urls文件里新增更新路由
path('updata_book/<int:id>',views.updata_book),
在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>
执行过程
功能三、删除操作
在all_book.html页面添加删除链接
在urls文件中新增删除路由
在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')
删除过程