博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018.7.12 个人博客主页的相关内容
阅读量:4608 次
发布时间:2019-06-09

本文共 5070 字,大约阅读时间需要 16 分钟。

测试数据的填充

要开始个人博客主页的展示,首先需要快速的向数据库填充一些测试数据,这就要利用Django的自带的后台管理功能来完成,进入admin.py配置相关参数:

from django.contrib import adminfrom 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
\w+)/(?P
((category)|(tag)|(time)))/(?P
\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
\w+)/(?P
\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})

  

转载于:https://www.cnblogs.com/yu-jie/p/9292619.html

你可能感兴趣的文章
C#中Dictionary小记
查看>>
mysql日期类型默认值'0000-00-00'容错处理
查看>>
openni和骨架追踪 rviz查看---34
查看>>
防止网站被iframe调用
查看>>
B - 畅通工程(并查集)
查看>>
linux使用rz、sz快速上传、下载文件
查看>>
基础练习 Huffuman树
查看>>
判断数字的正则表达式
查看>>
DOC常用命令(转)
查看>>
php写一个判断是否有cookie的脚本
查看>>
Mac配置Fiddler抓包工具
查看>>
转:Java并发集合
查看>>
Word截图PNG,并压缩图片大小
查看>>
Python项目对接CAS方案
查看>>
mysql产生随机数
查看>>
编程风格
查看>>
熟悉常用的Linux命令
查看>>
易之 - 我是个大师(2014年3月6日)
查看>>
如何在android项目中引用project作为类库引用
查看>>
《胡雪岩·红顶商人》—— 读后总结
查看>>