Django 利用管理器实现文章归档
Django管理器:class Manager
管理器是Django的模型进行数据库查询的接口,Django应用的每个模型都拥有至少一个管理器。默认情况下,Django为每个模型类添加一个名为objects的管理器,然而如果要将objects用于字段名称或想使用其他名称而不是objects来访问管理器,可在每个模型类中重命名他们。自定义的管理器方法可以返回你想要的任何数据,而不需要返回一个查询集。eg: models.py
# 文章模型
class Article(models.Model):
title = models.CharField(max_length=50, verbose_name='文章标题')
desc = models.CharField(max_length=50, verbose_name='文章描述')
content = models.TextField(verbose_name='文章内容')
click_count = models.IntegerField(default=0, verbose_name='点击次数')
is_recommend = models.BooleanField(default=False, verbose_name='是否推荐')
date_publish = models.DateTimeField(auto_now_add=True, verbose_name='发布时间')
user = models.ForeignKey(User, verbose_name='用户')
category = models.ForeignKey(Category, blank=True, null=True, verbose_name='分类')
tag = models.ManyToManyField(Tag, verbose_name='标签')
objects = ArticleManager() # 在模型中使用自定义的管理器
要实现文章归档,需要根据日期对文章这个模型类进行筛选:我们的目的是根据 ‘年-月’来归并所有文章,此外若 17年8月没有文章,则归档也不显示17年8月这一空白归档。类似如下:

为实现根据年-月的文章筛选,可以早models.py中建立一个文章管理器,继承自models.Manager:
class ArticleManager(models.Manager):
def distinct_date(self): # 该管理器定义了一个distinct_date方法,目的是找出所有的不同日期
distinct_date_list = [] # 建立一个列表用来存放不同的日期 年-月
date_list = self.values('date_publish') # 根据文章字段date_publish找出所有文章的发布时间
for date in date_list: # 对所有日期进行遍历,当然这里会有许多日期是重复的,目的就是找出多少种日期
date = date['date_publish'].strftime('%Y/%m 存档') # 取出一个日期改格式为 ‘xxx年/xxx月 存档’
if date not in distinct_date_list:
distinct_date_list.append(date)
return distinct_date_list
上文代码建立的管理器需要在文章模型类加上语句:objects = ArticleManager() ,然后就可以调用 distinct_date 方法了: archive_list = Article.objects.distinct_date(),对比:
article_list = Article.objects.all() # 获取所有文章,获取到的是所有文章对象的一个列表 archive_list = Article.objects.distinct_date() # 文章归档 获取到的列表格式为: xxx年/xxx月 存档
我们要将 archive_list 这个列表显示在html页面中,所有需要一个for循环:在base.html中加入:
<div class="tuwen">
<h3>文章归档</h3>
<ul>
{% for archive in archive_list %}
<li>
<p><span class="tutime font-size-18"><a href='{% url 'archive' %}?year={{ archive | slice:":4" }}&month={{ archive | slice:"5:7" }}'>{{ archive }}</a></span></p>
</li>
{% endfor %}
</ul>
</div>

左图即为html中的结果。 这里 {% url %} 这个模板标签的作用是解析视图函数对应的 URL 模式, 那么上文代码中 ‘{% url 'archive' %}’ 是指解析views.py 中视图函数archive对应的url模式。那么,每行归档文字都有了一个链接,格式为: http://127.0.0.1:8000/archive/?year=2015&month=02,{% url %}解析时会将year=2015和month=02 这两个参数值传递到 views.py 请求中。 综上,至此我们只实现了在base主页面上显示左图,并且为各个归档赋予了链接,下一步我们需要为这个链接编写相应的操作。
编写urls.py 和 views.py
回顾上文的链接http://127.0.0.1:8000/archive/?year=2015&month=02, 我们看到链接为 archive, 所以需要对应的urls 和 视图函数:
urls.py:
from blog.views import index, archive urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^$', index, name='index'),
url(r'^archive/$', archive, name='archive'), # url路由,那么http://127.0.0.1:8000/archive/ 实现了,后面的参数咋办?别急,在views中取出这个请求的参数
]
views.py:
def archive(request):
year = request.GET.get('year', None)
month = request.GET.get('month', None) # 取出两个参数 year,month
article_list = Article.objects.filter(date_publish__icontains=year+'-'+month) # 根据参数year,month进行过滤, 记得字段名+__icontains表大小写不敏感的包含匹配
return render(request, 'archive.html', locals())
至此,我们将所有 http://127.0.0.1:8000/archive/?year=XXX&month=XX 都实现url解析,并筛选出来满足year=XXX,month=XX的文章,下面我们需要在 archive.html 中将这些文章显示出来。
归档页面archive.html
在archive.html中加入文章归档显示内容
<div class="topnews">
<h2>文章归档</h2>
{% for article in article_list %} # 将XXX年XX月的所有文章进行展示
<div class="blogs">
<ul>
<h3><a href="/">{{ article.title }}</a></h3>
<p>{{ article.desc }}...</p>
<p class="autor"><span class="lm f_l">{% for tag in article.tag.all %}<a href="/">{{ tag.name }}</a> </span>{% endfor %}<span class="dtime f_l">{{ article.date_publish | date:'Y-m-d' }}</span><span class="viewnum f_r">浏览(<a href="/">{{ article.click_count }}</a>)</span><span class="pingl f_r">评论(<a href="/">{{ article.comment_set.all.count }}</a>)</span></p>
</ul>
</div>
{% endfor %}
</div>
注:下面也有分页代码
final:

注:另一种直接在views.archive中直接进行时间排序处理的方法,没有利用管理器,较为简洁。传送门
Django 利用管理器实现文章归档的更多相关文章
- Django 上下文管理器的应用
使用场景:模板继承可以减少页面内容的重复定义,实现页面内容的重用.个人博客右侧的导航栏都是继承base页面从而让代码得到最大程度的复用.但是当父模板中有动态数据的话,这些动态数据在子模版中是不会显示的 ...
- django orm 管理器 objects
给某张表的管理器重命名 class User(models.Model): name = models.CharField(max_length=100) people = models.Manage ...
- Django Managers管理器
Managers class Manager 管理器是向Django模型提供数据库查询操作的接口.Django应用程序中每个模型至少有一个管理器. Manager names 默认情况下管理器的名字为 ...
- [django]上下文管理器
上下文管理器django提取context中的数据去供模板调用 需求: 所有的页面都需要一个特定的变量 本质: python函数 , 接收一个HttpRequest对象的参数 , 且返回的必须是一个字 ...
- Django 上下文管理器,为父模板添加动态数据
1.摘要:模板继承可以减少页面内容的重复定义,实现页面内容的重用. 但是当父模板中有动态数据的话,这些动态数据在子模版中是不会显示的.我们可以通过自定义上下文处理器来解决 2.Django上下文处理器 ...
- asyncio之异步上下文管理器
异步上下文管理器 前面文章我们提到了上下文管理器,但是这个上下文管理器只适用于同步代码,不能用于异步代码(async def形式),不过不用担心今天我们就来讨论在异步中如何使用上下文管理器. 特别提醒 ...
- Django基础-004 上下文管理器&中间件&前端公共代码复用
一.上下文管理器 在views中重复使用的代码,可以在上下文管理器中实现 上下文管理器的处理流程如下: 1.先走完views里面的代码,将结果返回给前端 2.然后再将上下文的结果返回给前端 3.上下文 ...
- Django 源码小剖: Django ORM 查询管理器
ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从 ...
- Django ORM 查询管理器
Django ORM 查询管理器 ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言 ...
随机推荐
- LOJ #6432. 「PKUSC2018」真实排名(组合数)
题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...
- ARC062 - F. Painting Graphs with AtCoDeer (Polya+点双联通分量)
似乎好久都没写博客了....赶快来补一篇 题意 给你一个 \(n\) 个点 , 没有重边和自环的图 . 有 \(m\) 条边 , 每条边可以染 \(1 \to k\) 中的一种颜色 . 对于任意一个简 ...
- adb is down 的解决方法
今天装完android Eclipse 之后 ,运行时报出这么个错误 : The connection to adb is down, and a severe error has occured. ...
- 【BZOJ4259】残缺的字符串(FFT)
[BZOJ4259]残缺的字符串(FFT) 题面 给定两个字符串\(|S|,|T|\),两个字符串中都带有通配符. 回答\(T\)在\(S\)中出现的次数. \(|T|,|S|<=300000\ ...
- Mysql服务器处理客户端请求流程
在日常执行mysql语句的过程中,都是客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果). 看似很简单,其实不然,这内容有很多东西是需要注意的 ...
- Hihocoder 1329 平衡树·Splay(平衡树)
Hihocoder 1329 平衡树·Splay(平衡树) Description 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. 小Hi:怎么了? 小Ho:小H ...
- 为项目添加CUDA支持
最近研究体绘制方面的东西,需要用到CUDA加速.从官网下载了CUDA 7.0(支持VS2013)装好后,VS2013中能直接创建CUDA项目,也可以在原有项目中添加cu文件. 进入正题,为已有项目添加 ...
- Java程序员简历模板
背景:网上找的简历模板,自己在写简历时候可以作为参考. 本简历模板由国内首家互联网人才拍卖网站「 JobDeer.com 」提供. (括号里的是我们的顾问编写的说明,建议在简历书写完成后统一删除) 先 ...
- 收藏:SQL重复记录查询 .
来自:http://blog.csdn.net/chinmo/article/details/2184020 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select ...
- 智能指针unique_ptr
转自:https://www.cnblogs.com/DswCnblog/p/5628195.html 成员函数 (1) get 获得内部对象的指针, 由于已经重载了()方法, 因此和直接使用对象是一 ...