测试数据的填充
要开始个人博客主页的展示,首先需要快速的向数据库填充一些测试数据,这就要利用Django的自带的后台管理功能来完成,进入admin.py配置相关参数:
from django.contrib import admin
from app01 import models
# Register your models here.
admin.site.register(models.UserInfo)
admin.site.register(models.Article)
admin.site.register(models.Article2Tag)
admin.site.register(models.ArticleDetail)
admin.site.register(models.Blog)
admin.site.register(models.Category)
admin.site.register(models.Comment)
admin.site.register(models.Tag)
admin.site.register(models.UpDown)
admin.site.register(models.UserFans)
然后在命令行中输入相应命令:
python manage.py createsuperuser
回车后创建超级管理用户,输入http://127.0.0.1:8000/admin/进入管理界面:
根据提示即可快速创建相关测试数据。
博客首页的分类标签显示
首先是路由配置,这里在url中加了一个参数,用来传送博客博主后缀到后台,方便查询相关信息:
re_path('^blog/(\w+)/$', views.blog), # 进入某人博客主页
创建blog方法,利用values()和annotate()函数对数据库的数据进行分组,得到各类文章的数目:
def blog(request, name):
"""
显示博客主页,显示博主相关信息,文章分类
:param request:
:param name: 博客URL后缀
:return:
"""
blog_u = models.Blog.objects.filter(site=name).first() # 得到对应博客对象
if not blog_u:
return redirect('/')
article_list = models.Article.objects.filter(blog=blog_u)
# 按文章类型分类
category_list = models.Article.objects.filter(blog=blog_u).values('category_id', 'category__title').annotate(
ca=Count('nid'))
# 按标签分类
tag_list = models.Article2Tag.objects.filter(article__blog=blog_u).values('tag_id', 'tag__title').annotate(
ct=Count('id'))
# 按时间分类,extra内select=后面的是字典类型
time_list = models.Article.objects.filter(blog=blog_u).extra(
select={'new_time': "DATE_FORMAT(create_time, '%%Y-%%m')"}).values('new_time').annotate(cti=Count('nid'))
return render(request, 'blog.html', {
'blog_u': blog_u,
'article_list': article_list,
'category_list': category_list,
'tag_list': tag_list,
'time_list': time_list})
最后发送到前端将数据显示出来。其中的按照时间分类要注意的地方见小知识点总结。
个人博客的筛选
这部分我觉得最重要的地方就是URL路由的配置,先贴上路由配置:
re_path('^blog/(?P<name>\w+)/(?P<select_type>((category)|(tag)|(time)))/(?P<condition>\w+-*\w*)$',views.article_filter), # 进入分类页面,读取对应分类下的文章简介
这里在URL上添加了三个参数,第一个参数是博客后缀,没有什么可说的,第二个是分类依据参数,这里提供了三种分类依据,分别是类型,标签,时间,((category)|(tag)|(time))限制了参数的范围,最后的id参数之所以这样写是为了考虑时间参数的传入,这样写普通id和时间参数均可轻松传入。
在article_filter()中需要写的部分与blog()类似,唯一不一样的地方就是输出对应的文章列表,代码如下:
def article_filter(request, name, select_type, condition):
"""
博客的文章筛选,根据类型,标签,时间
:param request:
:param name: 博客URL后缀
:param select_type: 筛选类型(类型,时间,标签)
:param condition: 筛选id
:return:
"""
blog_u = models.Blog.objects.filter(site=name).first() # 得到对应博客对象
if not blog_u:
return redirect('/')
# 按文章类型分类
category_list = models.Article.objects.filter(blog=blog_u).values('category_id', 'category__title').annotate(
ca=Count('nid'))
# 按标签分类
tag_list = models.Article2Tag.objects.filter(article__blog=blog_u).values('tag_id', 'tag__title').annotate(
ct=Count('id'))
# 按时间分类,extra内select=后面的是字典类型
time_list = models.Article.objects.filter(blog=blog_u).extra(
select={'new_time': "DATE_FORMAT(create_time, '%%Y-%%m')"}).values('new_time').annotate(cti=Count('nid'))
"""
根据不同参数筛选需要的数据
"""
if select_type == 'category':
article_list = models.Article.objects.filter(blog=blog_u, category_id=condition)
elif select_type == 'tag':
article_list = models.Article.objects.filter(blog=blog_u, tags__nid=condition)
elif select_type == 'time':
article_list = models.Article.objects.filter(blog=blog_u).extra(
where=["DATE_FORMAT(create_time, '%%Y-%%m')=%s"], params=[condition, ])
return render(request, 'filter.html', {
'blog_u': blog_u,
'article_list': article_list,
'category_list': category_list,
'tag_list': tag_list,
'time_list': time_list})
博文最终页
URL路由配置:
re_path('^blog/(?P<name>\w+)/(?P<article_id>\d+).html$', views.article), # 进入博文详细页
这里传入了文章id,用于取对应文章的详细信息,加上.html后缀是为了让博客文章更容易被搜索引擎收录:D。
函数内的内容与上面的函数基本相同:
def article(request, name, article_id):
"""
返回显示博文详细的页面
:param request:
:param name: 博客URL后缀
:param article_id: 文章id
:return:
"""
blog_u = models.Blog.objects.filter(site=name).first() # 得到对应博客对象
if not blog_u:
return redirect('/')
select_article = models.Article.objects.filter(blog=blog_u, nid=article_id).first()
# 按文章类型分类
category_list = models.Article.objects.filter(blog=blog_u).values('category_id', 'category__title').annotate(
ca=Count('nid'))
# 按标签分类
tag_list = models.Article2Tag.objects.filter(article__blog=blog_u).values('tag_id', 'tag__title').annotate(
ct=Count('id'))
# 按时间分类,extra内select=后面的是字典类型
time_list = models.Article.objects.filter(blog=blog_u).extra(
select={'new_time': "DATE_FORMAT(create_time, '%%Y-%%m')"}).values('new_time').annotate(cti=Count('nid'))
return render(request, 'article.html', {
'blog_u': blog_u,
'select_article': select_article,
'category_list': category_list,
'tag_list': tag_list,
'time_list': time_list})