文章目录

  • 0.思路引导
  • 1.[最新文章] 模板标签
  • 2.[归档] 模板标签
  • 3.[分类] 模板标签
  • 4.[标签云] 模板标签
  • 5.使用自定义的模板标签

0.思路引导

博客侧边栏有四项内容:最新文章、归档、分类和标签云,效果展示如下:

这些内容相对比较固定和独立,且在各个页面都会显示,如果像文章列表或者文章详情一样,从视图函数中获取这些数据然后传递给模板,则每个页面对应的视图函数里都要写一段获取这些内容的代码,这会导致很多重复代码。

更好的解决方案是直接在模板中获取,为此,我们使用 django 的一个新技术:自定义模板标签来完成任务。

我们前面已经接触过一些 django 内置的模板标签,比如比较简单的 {% static %} 模板标签,这个标签帮助我们在模板中引入静态文件。还有比较复杂的如 {% for %} {% endfor%} 标签。

这里我们希望自己定义一个模板标签,例如名为 show_recent_posts 的模板标签,它可以这样工作:我们只要在模板中写入 {% show_recent_posts %},那么模板中就会渲染一个最新文章列表页面,这和我们在编写博客首页面视图函数是类似的。

首页视图函数中从数据库获取文章列表并保存到 post_list 变量,然后把这个 post_list 变量传给模板,模板使用 for 模板标签循环这个文章列表变量,从而展示一篇篇文章。

这里唯一的不同是我们从数据库获取文章列表的操作不是在视图函数中进行,而是在模板中通过自定义的 {% show_recent_posts %} 模板标签进行。

1.[最新文章] 模板标签

首先在 blog 应用下创建一个 templatetags 文件夹。然后在这个文件夹下创建一个 init.py 文件,使这个文件夹成为一个 Python 包,之后在 templatetags\ 目录下创建一个 blog_extras.py 文件,这个文件存放自定义的模板标签代码。
文件位置:blog/templatetags/blog_extras.py

from django import templatefrom ..models import Post, Category, Tagregister = template.Library()@register.inclusion_tag('blog/inclusions/_recent_posts.html', takes_context=True)
def show_recent_posts(context, num=5):return {'recent_post_list': Post.objects.all().order_by('-created_time')[:num],}

这里我们首先导入 template 这个模块,然后实例化了一个 template.Library 类,并将函数 show_recent_posts 装饰为 register.inclusion_tag,这样就告诉 django,这个函数是我们自定义的一个类型为 inclusion_tag 的模板标签。

inclusion_tag 模板标签和视图函数的功能类似,它返回一个字典值,字典中的值将作为模板变量,传入由 inclusion_tag 装饰器第一个参数指定的模板blog/inclusions/_recent_posts.html。

当我们在模板中(base.html)通过 {% show_recent_posts %}使用自己定义的模板标签时,django 会将指定模板的内容使用模板标签 {% show_recent_posts %}返回的模板变量渲染后替换。

接下来就是定义模板 _recent_posts.html 的内容。在 templates\blogs 目录下创建一个 inclusions 文件夹,然后创建一个 _recent_posts.html 文件,内容如下:

文件位置:templates\blogs\inclusions _recent_posts.html

<div class="widget widget-recent-posts"><h3 class="widget-title">最新文章</h3><ul>{% for post in recent_post_list %}<li><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></li>{% empty %}暂无文章!{% endfor %}</ul>
</div>

循环由{% show_recent_posts %}传递的模板变量 recent_post_list 即可,和 index.html 中循环显示文章列表是一样的。

2.[归档] 模板标签

和上一部分类似,接下来对其余部分代码进行补充。

文件位置:blog/templatetags/blog_extras.py

@register.inclusion_tag('blog/inclusions/_archives.html', takes_context=True)
def show_archives(context):return {'date_list': Post.objects.dates('created_time', 'month', order='DESC'),}

文件位置:templates\blogs\inclusions _archives.html

<div class="widget widget-archives"><h3 class="widget-title">归档</h3><ul>{% for date in date_list %}<li><a href="#">{{ date.year }} 年 {{ date.month }} 月</a></li>{% empty %}暂无归档!{% endfor %}</ul>
</div>

3.[分类] 模板标签

文件位置:blog/templatetags/blog_extras.py

@register.inclusion_tag('blog/inclusions/_categories.html', takes_context=True)
def show_categories(context):return {'category_list': Category.objects.all(),}

文件位置:templates\blogs\inclusions _categories.html

<div class="widget widget-category"><h3 class="widget-title">分类</h3><ul>{% for category in category_list %}<li><a href="#">{{ category.name }} <span class="post-count">(13)</span></a></li>{% empty %}暂无分类!{% endfor %}</ul>
</div>

4.[标签云] 模板标签

文件位置:blog/templatetags/blog_extras.py

@register.inclusion_tag('blog/inclusions/_tags.html', takes_context=True)
def show_tags(context):return {'tag_list': Tag.objects.all(),}

文件位置:templates\blogs\inclusions _tags.html

<div class="widget widget-tag-cloud"><h3 class="widget-title">标签云</h3><ul>{% for tag in tag_list %}<li><a href="#">{{ tag.name }}</a></li>{% empty %}暂无标签!{% endfor %}</ul>
</div>

5.使用自定义的模板标签

打开 base.html,为了使用刚才定义的模板标签,我们首先需要在模板中导入存放这些模板标签的模块,这里是 blog_extras.py 模块。当时我们为了使用 static 模板标签时曾经导入过 {% load static %},这次在 {% load static %} 下再导入 blog_extras:

文件位置:templates/base.html


{% load static %}
{% load blog_extras %}
<!DOCTYPE html>
<html>
...
</html>

然后找到侧边栏各项,将他们都替换成对应的模板标签:

文件位置:templates/base.html


<aside class="col-md-4">{% block toc %}{% endblock toc %}{% show_recent_posts %}{% show_archives %}{% show_categories %}{% show_tags %}<div class="rss"><a href=""><span class="ion-social-rss-outline"></span> RSS 订阅</a></div>
</aside>

此前侧边栏中各个功能块都替换成了模板标签,其实实际内容还是一样的,只是我们将其挪到了模块化的模板中,并有这些自定义的模板标签负责渲染这些内容。

此外我们定义的 show_recent_posts 标签可以接收参数,默认为 5,即显示 5 篇文章,如果要控制其显示 10 篇文章,可以使用 {% show_recent_posts 10 %} 这种方式传入参数。

现在运行开发服务器,可以看到侧边栏显示的数据已经不再是之前的占位数据,而是我们保存在数据库中的数据了。

Diango博客--8.解锁博客侧栏相关推荐

  1. 博客侧栏添加恋爱计时框

    介绍: 博客侧栏添加恋爱计时框 网盘下载地址: http://kekewl.cc/X41Kmd8RigM0 图片:

  2. css 侧栏跟随_如何实现博客的侧栏跟随(滚动条)效果

    现在许多web2.0风格的网站都喜欢用"侧栏跟随"的效果,就是当一个页面很长的时候,设定侧栏内容会跟随滚动条,这种效果适用于评论较多.内容较长的网站. 这种特效对提高网站浏览量.文 ...

  3. 从零开始搭建博客Hexo-Node-Git搭建博客

    从零开始搭建博客第一部分,Github注册及Github Pages建立 什么是 Hexo? Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲染引擎)解析文章,在 ...

  4. 从CSDN博客到独立博客的蜕变

    近日受到CSDN博客运营密斯大白的邀请,他希望我能以CSDN博客专家的身份写一篇探讨CSDN博客和独立博客各自优劣的文章,因此就有了今天这篇文章,本文从我作为一名CSDN博客专家的角度阐述博客作者们在 ...

  5. 博客园的博客积分与排名查看方法

    我是今天才知道,out.因为这东东默认是不显示的,因此找不到. 注意:只是你在博客园的博客的积分排名,而不是你的在博客园的排名. 设置-博客设置(博客后台管理)-选项-积分与排名打勾.刷新你的博客页面 ...

  6. 聊聊在博客园写博客的这两年《Unity 3D脚本编程:使用C#语言开发跨平台游戏》正式出版...

    版本状态: 2016.9 第一次印刷 (2016.11 输出到台湾) 2017.1 第二次印刷 2017.5 第三次印刷 2017.5 电子书上线:Unity 3D脚本编程--使用C#语言开发跨平台游 ...

  7. 用 Windows Live Writer 2009 为我们的博客园写博客(图)

    在此之前没有使用过Windows Live Writer 写过博客,看到dudu推荐用Windows Live Writer ,今天也尝试用了一下,并把过程记录下来供大家分享讨论. Windows L ...

  8. python爬虫爬取csdn博客专家所有博客内容

    python爬虫爬取csdn博客专家所有博客内容: 全部过程采取自动识别与抓取,抓取结果是将一个博主的所有 文章存放在以其名字命名的文件内,代码如下 #coding:utf-8import urlli ...

  9. 【网站搭建】搭建独立域名博客 -- 独立域名博客上线了 www.hanshuliang.com

    博客是安装在阿里云的服务器上. 小结 : -- 进入数据库命令 :mysql -uroot -p123456 ; -- 检查nginx配置语法 :.../nginx/sbin/nginx -t; -- ...

最新文章

  1. 【直播课】图像分类竞赛技巧与多标签分类实战
  2. 第十二届蓝桥杯大赛软件赛省赛第二场 C/C++ 大学B组
  3. {0,1,2.....Fmax} 每个数出现的次数
  4. Javascript中数组的sort方法的分析
  5. vs2015ef链接mysql_【转载】VS2015 + EF6连接MYSQL5.6
  6. 交换机生成树相关实验
  7. 计算机辅助公差技术主要研究内容,计算机辅助形位公差类型生成技术的分析研究.pdf...
  8. [USACO题库]1.2.3 Name That Number命名那个数字
  9. 转载:汽车上的控制器简介
  10. 自用gnome桌面美化插件
  11. R软件做线性回归分析
  12. [Keil 烧录器下载报错] “Flash Timeout. Reset the Target and try it again”
  13. 深度测评:贪心AI课程到底怎么样?
  14. java thread dump
  15. My97 DatePicker普通调用
  16. 【转贴】每月一个游戏
  17. 网络编程(CMD 窗口中通过局域网实现聊天对话)
  18. 第十四届蓝桥杯三月真题刷题训练——第 19 天
  19. 微信小程序开发 - WMusicPlayer小程序端设计
  20. 递增递减运算符 详解(++、--)

热门文章

  1. 程序员自我提高的几点建议 很实诚
  2. 苹果面试8大难题及答案
  3. Linux 上 安装 nginx、 阿里云服务器上安装 nginx
  4. mybatis :Criteria 查询、条件过滤用法
  5. eclipse启动出现“An Error has Occurred. See the log file”解决方法
  6. node 安装 webpack
  7. 点击表格弹窗获取另外一套数据之后,原表格相关数据的调用
  8. Mysql 替换字段的一部分内容
  9. VMware安装Centos7后有线线缆被拔出
  10. webpack自动化构建脚本指令npm run dev/build