• 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})
    

      

  • 相关阅读:
    分页得到查询总数的方法 mysql
    input[type="file"] change事件第二次不触发
    小程序post请求,后台接收不到数据的解决方法
    Docker安装Kibana
    Docker安装ElasticSearch
    Docker安装Redis
    Docker安装Tomcat
    Docker安装 Nginx
    mysql服务设置远程连接 解决1251 client does not support ..问题
    Docker 安装MySQL容器
  • 原文地址:https://www.cnblogs.com/yu-jie/p/9292619.html
Copyright © 2020-2023  润新知