Diango博客--8.解锁博客侧栏

文章目录

    • 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 %} 这种方式传入参数。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十五、详述 IntelliJ IDEA 插件的安装及使用方法

正文 首先&#xff0c;进入插件安装界面&#xff1a; Mac&#xff1a;IntelliJ IDEA -> Preferences -> Plugins;Windows&#xff1a;File -> Settings -> Plugins.标注 1&#xff1a;显示 IntelliJ IDEA 的插件分类&#xff0c; All plugins&#xff1a;显示 Inte…

面向数据流的设计方法

面向数据流的设计方法的目标是给出设计软件结构的一个系统化的途径。 在软件工程的需求分析阶段&#xff0c;信息流是一个关键考虑。通常用数据流图描绘信息在系统中加工和流动的 情况。面向数据流的设计方法定义了一些不同的“映射”&#xff0c;利用这些映射可以把数据流图…

AI研究的盲点:无解的神经网络内在逻辑

论人工神经网络内在逻辑的研究历史及现状。 伴随着大数据&#xff0c;人工智能&#xff08;AI&#xff09;在沉寂了多年之后&#xff0c;又迎来了新的高潮。在这场涉及大部分科学的革命中&#xff0c;人工神经网络释放了人工智能&#xff08;AI&#xff09;。但科学家们发现&a…

Diango博客--9.归档、分类和标签页

文章目录0.思路引导1.回顾2.归档页面3.分类页面4.标签页面0.思路引导 侧边栏已经正确地显示了最新文章列表、归档、分类、标签等信息&#xff0c;现在来完善归档、分类和标签功能。 当用户点击归档下的某个日期、分类栏目下的某个分类或者标签栏目下的某个标签时&#xff0c;…

android studio1.2.6,1.2.2 使用Android Studio开发Android APP | 菜鸟教程

写在前面本节将介绍如何使用Android Studio开发Android APP&#xff0c;和前面Eclipse ADT SDK搭建Android开发环境一样&#xff0c;本节也只是介绍一些基本东西&#xff0c;深入的&#xff0c;比如快捷键&#xff0c;小技巧等会再另一篇文章中详细地介绍&#xff01;1.下载A…

UPS开始尝试“货车+无人机”的投递方式,不必再担心快递员离职了

继亚马逊“空中仓库”&#xff0c;无人机送货再现新形式。 作为世界上最大的快递承运商与包裹递送公司&#xff0c;UPS当然也没有放过“送货无人机”这一新颖业务。与亚马逊推出“空中仓库”的理念类似&#xff0c;UPS并没有选择让无人机从仓库直接起飞&#xff0c;而是将之与…

Diango博客--10.交流的桥梁“评论功能”

文章目录0.思路引导1.创建"评论"应用2.设计"评论"的数据库模型3.注册"评论"模型到 admin4.设计“评论”表单5.展示评论表单6.“评论”视图函数7.绑定 URL8.向读者发送是否“评论”成功的状态9.详情页底部显示“评论”内容0.思路引导 本文将创建…

python与android交互,Android客户端与Python服务器端的简单通信

最近在做一个APP&#xff0c;需要与服务器通信&#xff0c;一点一点的尝试&#xff0c;记录一下。本文使用了OkHttp和Flask框架。Android客户端&#xff1a;实现功能输入完点击OK按钮后会toast成功的信息。Python服务端&#xff1a;各部分代码如下&#xff1a;activity_main.xm…

云栖科技评论第48期:前沿科技对世界的改造 我们这代人只完成了1%

1、数字经济版图呈中美双分趋势 日本IT行业为前景担忧 数字经济版图呈中美双分趋势 日本IT行业为前景担忧 【新闻摘要】《日本经济新闻》日前刊文称&#xff0c;数字经济的势力版图呈现中国和美国两强双分的趋势明显&#xff0c;这意味着日本可能不得不使用中美的技术&#xff…

CentOS下添加Root权限用户‘超级用户’方法(xxx is not in the sudoers file.This incident will be reported.的解决方法)

文章目录1.添加普通用户2.添加sudo文件的写权限3.编辑sudoers文件4.撤销sudoers文件写权限1.添加普通用户 [rootserver ~]# useradd fxd //添加一个名为fxd的用户 [rootserver ~]# passwd fxd //修改密码 Changing password for user chenjiafa. New UNIX password: //在这里输…

android打印intent flag,Android flag详解

Android flag详解Android flag详解一.Flag标志位在阅读源码的时候经常发现有一些标志属性使用一些位操作来判断是否具有该标志&#xff0c;增加标志或者去除标志。如&#xff1a;二.addFlags (int flags)和setFlags (int flags)区别Public Intent addFlags (int flags)增加额外…

开启市场新格局 且看新华三计算与存储新品发布会

全球领先的新IT解决方案领导者新华三将于8月31日在北京钓鱼台国宾馆举办“新IT 新动能 新格局 新华三下一代计算与存储发布会”&#xff0c;重磅发布服务器和存储的全线新品。 2017年初&#xff0c;新华三集团正式推出了“应用驱动 云领未来”的新IT战略。在这一战略指引下&…

龟兔赛跑问题

题目 乌龟与兔子进行赛跑&#xff0c;跑场是一个矩型跑道&#xff0c;跑道边可以随地进行休息。乌龟每分钟可以前进3米&#xff0c;兔子每分钟前进9米&#xff1b;兔子嫌乌龟跑得慢&#xff0c;觉得肯定能跑赢乌龟&#xff0c;于是&#xff0c;每跑10分钟回头看一下乌龟&#x…

Unity4.6证书激活问题

第一次运行的激活问题安装好Unity4.6之后首次启动会自动连网&#xff0c;但是会出现error loading page错误&#xff0c;SSL peer certificate or SSH remote key was not OK。如下图所示&#xff1a; 点OK就退出了。再启动一遍也是一样的。 这时可以先暂时断一下网&#xff0c…

Readhat中挂载yum源

文章目录1.链接物理镜像2.查看原始挂载目录3.挂载4.新建iso.repo5.查看挂载目录1.链接物理镜像 vmware控制台中&#xff0c;勾选设备状态成“已连接”&#xff0c;会在桌面生成镜像图标。 2.查看原始挂载目录 输入以下指令&#xff1a; [rootlocalhost ~]# df -h Filesystem…

知其所以然地学习(以算法学习为例)

其实下文的绝大部分内容对所有学习都是同理的。只不过最近在正儿巴经地学算法&#xff0c;而后者又不是好啃的骨头&#xff0c;所以平时思考总结得就自然要比学其它东西要多一些。 问题&#xff1a;目前几乎所有的算法书的讲解方式都是欧几里德式的、瀑布式的、自上而下的、每…

【Java】 大话数据结构(1) 线性表之顺序存储结构

本文根据《大话数据结构》一书&#xff0c;实现了Java版的顺序存储结构。 顺序存储结构指的是用一段地址连续的存储单元一次存储线性表的数据元素&#xff0c;一般用一维数组来实现。 书中的线性表抽象数据类型定义如下&#xff08;第45页&#xff09;&#xff1a; 实现程序&am…

Readhat中升级openssh

1.挂载yum源&#xff08;镜像&#xff09; 如何挂载yum源&#xff08;镜像&#xff09;&#xff0c;在本人的另外一篇博客中&#xff0c;请戳这里 2.安装升级所需依赖 由于升级ssh需要安装依赖&#xff0c;这里提前将所需依赖安装 指令&#xff1a; yum install -y zlib-dev…

Readhat中作安全基线

文章目录1.新建文件夹并上传脚本2.修改脚本中设置root2用户的密码字段3.添加脚本的可执行权限4.执行脚本5.尝试使用root2登录验证1.新建文件夹并上传脚本 在根目录下的/openssh8&#xff08;没有则新建&#xff09;中上传脚本&#xff1a; 2.修改脚本中设置root2用户的密码字…

WordPress插件开发-创建、停用、删除插件

插件存放目录 wp-content/plugins 创建一个插件 在plugins创建一个文件插件文件夹&#xff0c;命名最好加前缀&#xff0c;这个前缀可以使用你的名字或者你自己的域名&#xff0c;防止插件和别人重名&#xff0c;再创建一个PHP文件名字和你的插件名一样。我这里创建一个名为 yg…