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>&nbsp;</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 利用管理器实现文章归档的更多相关文章

  1. Django 上下文管理器的应用

    使用场景:模板继承可以减少页面内容的重复定义,实现页面内容的重用.个人博客右侧的导航栏都是继承base页面从而让代码得到最大程度的复用.但是当父模板中有动态数据的话,这些动态数据在子模版中是不会显示的 ...

  2. django orm 管理器 objects

    给某张表的管理器重命名 class User(models.Model): name = models.CharField(max_length=100) people = models.Manage ...

  3. Django Managers管理器

    Managers class Manager 管理器是向Django模型提供数据库查询操作的接口.Django应用程序中每个模型至少有一个管理器. Manager names 默认情况下管理器的名字为 ...

  4. [django]上下文管理器

    上下文管理器django提取context中的数据去供模板调用 需求: 所有的页面都需要一个特定的变量 本质: python函数 , 接收一个HttpRequest对象的参数 , 且返回的必须是一个字 ...

  5. Django 上下文管理器,为父模板添加动态数据

    1.摘要:模板继承可以减少页面内容的重复定义,实现页面内容的重用. 但是当父模板中有动态数据的话,这些动态数据在子模版中是不会显示的.我们可以通过自定义上下文处理器来解决 2.Django上下文处理器 ...

  6. asyncio之异步上下文管理器

    异步上下文管理器 前面文章我们提到了上下文管理器,但是这个上下文管理器只适用于同步代码,不能用于异步代码(async def形式),不过不用担心今天我们就来讨论在异步中如何使用上下文管理器. 特别提醒 ...

  7. Django基础-004 上下文管理器&中间件&前端公共代码复用

    一.上下文管理器 在views中重复使用的代码,可以在上下文管理器中实现 上下文管理器的处理流程如下: 1.先走完views里面的代码,将结果返回给前端 2.然后再将上下文的结果返回给前端 3.上下文 ...

  8. Django 源码小剖: Django ORM 查询管理器

    ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从 ...

  9. Django ORM 查询管理器

    Django ORM 查询管理器 ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言 ...

随机推荐

  1. 09 Zabbix Item类型之Zabbix SNMP类型

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 Zabbix Item类型之Zabbix SNMP类型 SNMP是监控服务器以外设备的非常好的方式 ...

  2. BZOJ 4754 [JSOI2016]独特的树叶 | 树哈希判同构

    题目链接 这道题是一道判断无根树同构的模板题,判断同构主要的思路就是哈希. 一遇到哈希题,一百个人能有一百零一种哈希方式,这篇题解随便选用了一种--类似杨弋<Hash在信息学竞赛中的一类应用&g ...

  3. UOJ #164. 【清华集训2015】V | 线段树

    题目链接 UOJ #164 题解 首先,这道题有三种询问:区间加.区间减(减完对\(0\)取\(\max\)).区间修改. 可以用一种标记来表示--标记\((a, b)\)表示把原来的值加上\(a\) ...

  4. 窗体监听事件WindowListener

    EXIT_ON_CLOSE:结束窗口所在的应用程序.在窗口被关闭的时候会退出JVM. DISPOSE_ON_CLOSE:隐藏当前窗口,并释放此窗体占有的资源.如果程序没有其他线程在运行,当所有窗口都被 ...

  5. Shell脚本编写及常见面试题

      注意事项 1)开头加解释器:#!/bin/bash 2)语法缩进,使用四个空格:多加注释说明. 3)命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 4)默认变量是全局的, ...

  6. 超详细从零记录Hadoop2.7.3完全分布式集群部署过程

    超详细从零记录Ubuntu16.04.1 3台服务器上Hadoop2.7.3完全分布式集群部署过程.包含,Ubuntu服务器创建.远程工具连接配置.Ubuntu服务器配置.Hadoop文件配置.Had ...

  7. scrapy xpath、正则表达式、css选择器

    scrapy xpath XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力. 学习 ...

  8. 【小白技术笔记】保存皮皮虾APP无水印视频到手机相册,只需要三步 [技术干货]

    百万段友回皮皮虾,转身一变,都成了皮友.作为当年的资深段友,今天的皮友的我.看到好视频,经典视频,搞笑视频,就想保存一份到手机相册,然后皮皮虾啊皮皮虾,有个让人很讨厌的地方,保存视频的时候就有皮皮虾的 ...

  9. Hbase记录-Hbase介绍

    Hbase是什么 HBase是一种构建在HDFS之上的分布式.面向列的存储系统,适用于实时读写.随机访问超大规模数据的集群. HBase的特点 大:一个表可以有上亿行,上百万列. 面向列:面向列表(簇 ...

  10. div中让内容能不换行就尽量不换行.【纯原】

    div中让内容能不换行就尽量不换行,部分左对齐,部分右对齐. <html> <head> <title>九歌·少司命</title> <style ...