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

文章目录

    • 0.思路引导
    • 1.回顾
    • 2.归档页面
    • 3.分类页面
    • 4.标签页面

0.思路引导

侧边栏已经正确地显示了最新文章列表、归档、分类、标签等信息,现在来完善归档、分类和标签功能。

当用户点击归档下的某个日期、分类栏目下的某个分类或者标签栏目下的某个标签时,跳转到文章列表页面,显示该日期、分类或者标签下的全部文章。
在这里插入图片描述

1.回顾

首页index.html继承base.html,当首页加载时,base.html中的模板标签{% show_recent_post %}、 {% show_archieves %}、 {% show_categories %}、{% show_tages %},即在blog_extra.py中定义的模板标签,从数据库中获取数据,

在这里插入图片描述
在这里插入图片描述同时对模板标签中参数指向的模板进行渲染,返回首页内容,展示给读者。
在这里插入图片描述
其中“最近文章”的跳转地址通过get_post_url获取,在上一篇文章中已经说明,本篇将对“归档”、“分类”、“标签页”进行点击跳转的相关操作。

2.归档页面

1)首先,在 inclusions 文件夹下找到 archives 的模板,修改超链接的 href 属性,让用户点击超链接后跳转到文章归档页面:

文件位置:templates/blog/inclusions/_archives.html

...
{% for date in date_list %}
<li><a href="{% url 'blog:archive' date.year date.month %}">{{ date.year }}{{ date.month }}</a>
</li>
{% endfor %}
...

这里 {% url %} 这个模板标签的作用是解析视图函数 blog:archive 对应的 URL 模式,并把 URL 模式中的年和月替换成 date.year,date.month 的值。

{% url %} 模板标签接收的第一个参数为被解析视图函数的端点值,这个端点值由 2 部分组成,中间由冒号分隔。第一部分为在应用的 urls.py 中指定的 app_name 的值(充当命名空间,这样即使不同 app 下有相同的视图函数名,也不会冲突),第二部分 path 函数中传入的 name 参数的值。比如在 blog 应用的 urls.py 模块,我们指定了 app_name = ‘blog’,archive 视图函数的 url 模式为 path(‘archives/int:year/int:month/’, views.archive, name=‘archive’),因此对应的端点值为 blog:archive。

{% url %} 模板标签接收的其它参数为 URL 路径参数,即 URL 模式中路径参数转换器需要捕获的值。例如 archive 视图函数对应的 URL 模式为 archives/int:year/int:month/,假设 date.year=2017,date.month=5,那么 {% url ‘blog:archive’ date.year date.month %} 模板标签返回的值为 /archives/2017/5/。

为什么要使用 {% url %} 模板标签呢?事实上,我们把超链接的 href 属性设置为 /archives/{{ date.year }}/{{ date.month }}/ 同样可以达到目的,但是这种写法是硬编码的。虽然现在 blog:archive 视图函数对应的 URL 模式是这种形式,但是如果哪天这个模式改变了呢?如果使用了硬编码的写法,那你需要把每一处 /archives/{{ date.year }}/{{ date.month }}/ 修改为新的模式。但如果使用了 {% url %} 模板标签,则不用做任何修改。

2)其次,对路由进行设置:

文件位置:blog/urls.py

from django.urls import pathfrom . import viewsapp_name = 'blog'
urlpatterns = [path('', views.index, name='index'),path('posts/<int:pk>/', views.detail, name='detail'),path('archives/<int:year>/<int:month>/', views.archive, name='archive'),
]

这个归档视图对应的 URL 和 detail 视图函数对应的 URL 是类似的.

django 会从用户访问的 URL 中自动提取 URL 路径参数转换器 type:name 规则捕获的值,然后传递给其对应的视图函数。

例如如果用户想查看 2017 年 3 月下的全部文章,他访问 /archives/2017/3/,那么 URL 转换器就会根据规则捕获到 2017 和 3 这两个整数,然后作为参数传给 archive 视图函数, archive 视图函数的实际调用为:archive(request, year=2017, month=3)。

3)编写视图函数:

文件位置:blog/views.py

from .models import Postdef archive(request, year, month):post_list = Post.objects.filter(created_time__year=year,created_time__month=month).order_by('-created_time')return render(request, 'blog/index.html', context={'post_list': post_list})

这里使用了模型管理器(objects)的 filter 方法来过滤文章。由于是按照日期归档,因此这里根据文章发表的年和月来过滤。具体来说,就是根据 created_time 的 year 和 month 属性过滤,筛选出文章发表在对应的 year 年和 month 月的文章。

注意这里 created_time 是 Python 的 date 对象,其有一个 year 和 month 属性,Python 中调用属性的方式通常是 created_time.year,但是由于这里作为方法的参数列表,所以 django 要求我们把点替换成了两个下划线,即 created_time__year。

同时和 index 视图中一样,我们对返回的文章列表进行了排序。此外由于归档页面和首页展示文章的形式是一样的,因此直接复用了 index.html 模板。

3.分类页面

同样的逻辑,接下来对分类页面和标签页面进行补充。

文件位置:templates/blog/inclusions/_categories.html

...
{% for category in category_list %}
<li><a href="{% url 'blog:category' category.pk %}">{{ category.name }}</a>
</li>
{% endfor %}
...

文件位置:blog/urls.py

urlpatterns = [path('archives/<int:year>/<int:month>/', views.archive, name='archive'),path('categories/<int:pk>/', views.category, name='category'),
]

文件位置:blog/views.py


# 引入 Category 类
from .models import Post, Categorydef category(request, pk):# 记得在开始部分导入 Category 类cate = get_object_or_404(Category, pk=pk)post_list = Post.objects.filter(category=cate).order_by('-created_time')return render(request, 'blog/index.html', context={'post_list': post_list})

4.标签页面

文件位置:templates/blog/inclusions/_tags.html

...
{% for tag in tag_list %}<li><a href="{% url 'blog:tag' tag.pk %}">{{ tag.name }}</a></li>
{% empty %}暂无标签!
{% endfor %}
...

文件位置:blog/urls.py

from django.urls import pathfrom . import viewsapp_name = 'blog'
urlpatterns = [...path('categories/<int:pk>/', views.category, name='category'),path('tags/<int:pk>/', views.tag, name='tag'),
]

文件位置:blog/views.py

from .models import Category, Post, Tagdef tag(request, pk):# 记得在开始部分导入 Tag 类t = get_object_or_404(Tag, pk=pk)post_list = Post.objects.filter(tags=t).order_by('-created_time')return render(request, 'blog/index.html', context={'post_list': post_list})

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

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

相关文章

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…

Diango博客--11.Nginx + Gunicorn + Supervisor 方式部署

文章目录0.部署前准备1.创建一个超级用户2.更新 SQLite33.安装 Python3 、pip3.6以及 Pipenv4.部署代码5.使用 Gunicorn6.启动 Nginx 服务器7.配置 Nginx8.关闭 DEBUG 模式&#xff0c;收集静态文件9.使用 Supervisor管理 Gunicorn 进程10.使用 CDN 加快 Bootstrap 和 jQuery 的…

StringBuilder类

1.1 StringBuilder类概述StringBuilder:是一个可变的字符串。字符串缓冲区类。 String和StringBuilder的区别&#xff1a;String的内容是固定的StringBuilder的内容是可变的1.1.1 拼接字符串耗费内存原因:每次拼接都会产生新的字符串对象,而利用StringBuilder来拼接字符串自始至…

如何使用搜索技巧来成为一名高效的程序员

没有人是完全独立的孤岛&#xff0c;每个人都是整体的一部分。—— 约翰多恩对于缺乏编程知识的人来说&#xff0c;完全有可能编写一个网页或小程序。如果在用Google搜索相关示例时幸运的话&#xff0c;可以搜到现成的代码。即使是经验丰富的程序员&#xff0c;通常也会为了节省…

linux系统优化思路

文章目录一. 影响linux性能的因素1.系统硬件资源2.操作系统相关资源3.应用程序软件资源二. 分析系统性能涉及的人员1.Linux运维人员2.系统架构设计人员3.软件开发人员三. 系统性能分析工具四.思路总结一. 影响linux性能的因素 1.系统硬件资源 1&#xff09;cpu 2&#xff09;…