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. Leetcode 7.反转整数 By Python

    给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假 ...

  2. Android 视频 教程 源码 电子书 网址

    资源名称 资源地址 下载量 好评率8天快速掌握Android视频教程67集(附源码)http://down.51cto.com/zt/2197 32157Android开发入门之实战技巧和源码 htt ...

  3. 【BZOJ5286】[HNOI2018]转盘(线段树)

    [BZOJ5286][HNOI2018]转盘(线段树) 题面 BZOJ 洛谷 题解 很妙的一道题目啊.(全世界除了我这题都有40分,就我是一个状压选手 首先来发现一些性质,我们走一圈一定不会更差. 为 ...

  4. 洛谷 P4408 逃学的小孩 解题报告

    P4408 [NOI2003]逃学的小孩 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?&q ...

  5. Java NIO -- 直接缓冲区与非直接缓冲区

    直接缓冲区与非直接缓冲区: 非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建 ...

  6. Bash: about .bashrc, .bash_profile, .profile, /etc/profile, etc/bash.bashrc and others

    Some interesting excerpts from the bash manpage:When bash is invoked as an interactive login shell, ...

  7. 多线程状态下调用SimpleDateFormat.format()抛出 ArrayIndexOutOfBoundsException 异常

    本来想在类的顶部设置一个 静态的SimpleDateFormat常量 public final static DateFormat dateFormatGMT = new SimpleDateForm ...

  8. 多个 ng-app 中 Controllers & Services 之间的通信

    原文发布在个人独立博客上,链接:http://pengisgood.github.io/2016/01/31/communication-between-multiple-angular-apps/ ...

  9. MUI 自定义从底部弹出的弹出框

    1)效果: 点击“点击就送”那个按钮之后,弹窗从底部弹出并自带蒙层,然后点击弹窗之外的灰色部分就从底部消失: 第一步:引入 mui.css或者mui.min.css 引入 mui.min.js或者mu ...

  10. HTTP Status 405 - HTTP method POST is not supported by this URL

    出现这个问题, 1.在servlet中没有调用post()方法引起的 2.在serlvet中跳转没有用外跳(response.sendRedirect()) 我的是因为第一种,是没有写dopost() ...