前情提要:
Django博客项目(一)—— 注册和登录页面
Django博客项目(二)—— 博客首页
本文继续介绍博客项目的第三部分,博客列表及博客搜索功能的实现。
效果图
本页面总共可看作五个部分:
- 博客信息
显示在页面上的信息包括:发表时间、分类、标题、内容、作者、回复数量。
- 分页显示
为了使页面整洁,使用分页的方法显示博客,每页显示四篇。
- 博客搜索
填入关键字,点击搜索图标,即可进行搜索。标题或内容包含关键字的博客会显示在结果页面中。
- 最近发表的博客
最近发表的四篇博客会显示在页面中。信息包括标题及回复数量。
- 博客分类统计
显示各个分类的博客数量。
settings.py文件中添加配置
COUNT_PER_PAGE = 4
路由配置
本页面使用的路由有:
app_name = 'App01'
urlpatterns = [
path('blogs/', views.blogs, name='blogs'),
path('blogs/<int:page>/', views.blogs, name='blogs'),
path('search/<pattern>/', views.search, name='search'),
path('search/<pattern>/<int:page>/', views.search, name='search'),
]
博客列表和搜索功能都使用两个路由,他们分别使用同一个视图函数,主要是为了在分页显示博客时,可根据路由中的页码进行页面显示。
视图函数
# 博客列表
def blogs(request, page=1):
categories = BlogCategory.objects.all()
# 博客显示顺序为按最近发表进行排序
blogs_count = BlogPost.objects.order_by('-addtime')
paginator = Paginator(blogs_count, COUNT_PER_PAGE)
page_obj = paginator.page(int(page))
# 分页显示
page_data = {
'data': page_obj.object_list,
'page_objs': page_obj,
'page_range': paginator.page_range,
'page_nums': paginator.num_pages
}
return render(request, 'blog_r/blog.html', locals())
# 博客搜索
def search(request, pattern, page=1):
if request.method == 'POST':
pattern = request.POST.get('search_pattern')
else:
pattern = pattern
# 结果为标题或内容包含关键字的博客
search_blogs = BlogPost.objects.filter(Q(content__icontains=pattern) | Q(title__icontains=pattern)).all()
categories = BlogCategory.objects.a