今天在学习Django的时候找了个需求来写,突然搞明白了项目中模板内的链接点击之后视图函数应该如何来处理
需求如下:
有一个图书管理页面,输入地址:ip:8000/index之后显示图书表里面所有的图书信息(只用显示名称),点击“新增”按钮之后,会在图书最下方显示一本新的书名“流星蝴蝶剑”;点击“删除”按钮之后,改行图书名称不在继续显示
需求很简单,分析一下,你需要准备一个图书的模型类,以及三个视图函数来依次实现展示、新增、删除的功能,还要再准备url地址来调用三个视图函数,最后就是要准备一个模板文件
如果要是换作了刚开始学习的时候,我会想着三个url地址,那肯定是要准备三个模板文件才行呀。但是刚才突然想明白了,我只需要一个模板就可以了,在其中设置另外两个url地址,让url可以正确完成路由匹配到对应的视图函数。因为需求说的很明确,不管你是“新增”还是“删除”操作,都是在一个页面内完成,并没有跳转过任何其他的也买你,所以呢就只需要在添加和删除的视图函数中,renturn到最开始的显示图书信息的视图函数就可以了
模型类:
class BookInfo(models.Model):
"""图书模型类"""
# 书名
btitle = models.CharField(max_length=50)
# 出版日期
bpub_date = models.DateField()
# 阅读数量
bread = models.IntegerField(default=0)
# 评论量
bcommon = models.IntegerField(default=0)
# 是否删除
isDelete = models.BooleanField(default=False)
def __str__(self):
return self.btitle
模板文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<a href="/insert">新增</a>
<ul>
{% for book in books %}
{% if not book.isDelete %}
<li>{{ book.btitle }}--<a href="/delete/{{ book.id }}">删除</a> </li>
{% endif %}
{% endfor %}
</ul>
</body>
</html>
视图函数:
from django.shortcuts import render
from booktest.models import BookInfo,HeroInfo
from datetime import date
# Create your views here.
def show_books(request):
"""显示图书信息的函数"""
# 需要获取所有图书的信息
books = BookInfo.objects.all()
print(books)
return render(request, 'bookset/index.html', {'books': books})
def insert_book(request):
"""新增图书信息,增加一条书-流星蝴蝶剑"""
book = BookInfo()
book.btitle = '流星蝴蝶剑'
book.bpub_date = date(2010, 1,1)
book.bread = 20
book.bcommon = 30
book.isDelete = False
book.save()
return show_books(request)
def delete_book(request, bid):
"""删除图书信息"""
book = BookInfo.objects.get(id=bid)
book.isDelete = True
book.save()
return show_books(request)
url路由的配置就不贴了,自行配置下吧
2020/3/16更新:
哈哈哈哈,我好傻逼啊,django已经提供了一个很好的重定向的类了,我还去纠结怎么重定向。
上面的方法也可以完成需求,但有一个问题,会暴露url地址,也就是每次操作之后url地址都改变了
可以使用django提供的HttpResponseRedirect类来完成重定向,方法也很简单,在视图函数最后的return中调用,以上面的代码为例
from django.shortcuts import render
from booktest.models import BookInfo,HeroInfo
from datetime import date
from django.http import HttpResponseRedirect
# Create your views here.
def show_books(request):
"""显示图书信息的函数"""
# 需要获取所有图书的信息
books = BookInfo.objects.all()
print(books)
return render(request, 'bookset/index.html', {'books': books})
def insert_book(request):
"""新增图书信息,增加一条书-流星蝴蝶剑"""
book = BookInfo()
book.btitle = '流星蝴蝶剑'
book.bpub_date = date(2010, 1,1)
book.bread = 20
book.bcommon = 30
book.isDelete = False
book.save()
# return show_books(request)
# 改为使用django模块提供的HttpResponseReddirect可以更好的实现
return HttpResponseRedirect('/index')
def delete_book(request, bid):
"""删除图书信息"""
book = BookInfo.objects.get(id=bid)
book.isDelete = True
book.save()
return show_books(request)