1.redirect
比如delete视图函数中return采用redirect重定向,reverse中一定是urls的name属性值,该属性指向唯一的url,所以blog:list会指向该属性对应的url
def delete(request,blog_id):
blog_obj = Blog.objects.get(id=blog_id)
#判断是否还有这个内容,有的话,删除
if blog_obj:
blog_obj.delete()
#使用redirect重定向
return redirect(reverse('blog:list'))
else:
return HttpResponse('文章不存在')
blog_app的urls如下:list属性对应着list视图函数,按住ctrl+view.list可以跳转到该函数
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path('index/',views.index,name='index'),
path('add/',views.BlogAdd.as_view(),name='add'),
path('list/',views.list,name='list'),
path('detail/<blog_id>/',views.detail,name='detail'),
path('delete/<blog_id>/',views.delete,name='delete'),
path('update/<blog_id>/',views.BlogUpdate.as_view(),name='update'),
]
list视图函数如下,该函数会从Blog模型类(也就是Blog数据表)中获取全部数据赋值给blogs,并用render渲染到list.html模板中,同时携带着blogs这个模板变量
def list(request):
blogs = Blog.objects.all()
return render(request,'blog/list.html',context={'blogs':blogs})
Blog模型类如下所示:
from django.db import models
# Create your models here.
class Blog(models.Model):
title = models.CharField(max_length=50,blank=True)
content = models.TextField()
def __str__(self):
return f'title={self.title},content={self.content}'
list.html模板如下:
{% extends 'blog/base.html' %}
{% block title %}
博客列表页
{% endblock %}
{% block body %}
<h1>文章列表</h1>
<table>
<tr>
<th>标题</th>
<th>操作</th>
</tr>
{% for blog in blogs%}
<tr>
<td><a href="{% url 'blog:detail' blog.id %}">{{ blog.title }}</a></td>
<td>
<a href="{% url 'blog:update' blog.id %}">编辑</a>
<a href="{% url 'blog:delete' blog.id %}">删除</a>
</td>
</tr>
{% endfor %}
</table>
<a href="{% url 'blog:index' %}">返回首页</a>
{% endblock %}
2.render
如果使用render,此时相当于将list视图的代码copy过来,直接实现list视图函数的功能,即直接去携带查询的参数渲染到前端,如果不带该参数,前端显示时不会显示数据,因为确实blog模板变量,但是mysql中的该行数据已经删除
def delete(request,blog_id):
blog_obj = Blog.objects.get(id=blog_id)
#判断是否还有这个内容,有的话,删除
if blog_obj:
blog_obj.delete()
# 如果不用redirect重定向
blogs = Blog.objects.all()
return render(request,'blog/list.html',context={'blogs':blogs})
else:
return HttpResponse('文章不存在')