2018.7.12 个人博客主页的相关内容

测试数据的填充

要开始个人博客主页的展示,首先需要快速的向数据库填充一些测试数据,这就要利用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})

  

猜你喜欢

转载自www.cnblogs.com/yu-jie/p/9292619.html
今日推荐