文章的日期归档

涉及到三个知识点

date_format(日期转换)

**mysql日期类型 date,time,datetime的区别

create table t_mul(d date,t time,dt datetime);
insert into t_mul values(now(),now(),now());
select * from t_mul;

mysql> select * from t_mul;
+------------+----------+---------------------+
| d          | t        | dt                  |
+------------+----------+---------------------+
| 2017-08-01 | 19:42:22 | 2017-08-01 19:42:22 |
+------------+----------+---------------------+
1 row in set (0.00 sec)

如果只想要年和月,可以使用date_format设定日期显示的格式 %Y 年,4 位 %m 月,数值(00-12) DATE_FORMAT(NOW(),'%Y-%m')

在mysql里叫做date_format,sqllite里叫striftime

extra

怎么在表中多出一个字段只存储年月信息? 有些情况下ORM需要配合sql语句进行使用,Django 提供了 extra() QuerySet修改机制 — 它能在 QuerySet生成的SQL从句中注入新子句 举例1: The select 参数可以让你在 SELECT 从句中添加其他字段信息,它应该是一个字典,存放着属性名到 SQL 从句的映射

queryResult=models.Article
           .objects.extra(select={'is_recent': "create_time > '2017-09-05'"})

返回值依然是个QuerySet is_recent是一个布尔值,如果create_time的值大于'2017-09-05',那么is_recent的值就是Ture

举例2:

date_list = Article.objects.extra(select={"standard_time":"strftime('%%Y-%%m',create_time)"}).values("title", "standard_time")
    print("date_list==>", date_list)

结果:

date_list==> <QuerySet [{'standard_time': '2017-10', 'title': '一步一步理解 python web 框架'}, 
{'standard_time': '2018-05', 'title': 'React从入门到放弃之前奏'}, 
{'standard_time': '2017-12', 'title': '关于Kafka监控方案的讨论'}, 
{'standard_time': '2017-03', 'title': 'Nginx 入门学习教程'}, 
{'standard_time': '2018-01', 'title': 'Rsync+sersync实现数据实时同步'}]>

ORM分组查询(单表)

模板继承

模板base.html,其它模板继承它

{% block content %}
继承的位置
{% endblock %}

其它需要继承base的模板 首先写上:

{% extends "base.html" %}

{% block content %}
继承的位置(在这么里面写自己页面独立的东西,其它都继承base.html)
{% endblock %}

函数的封装调用

首先封装一个函数

def get_data(username):

    # 查询当前站点对象
    blog = user.blog
	
	#查询每一个分类的名称以及对应的文章数
    from django.db.models import Count
    #分类列表
    cate_list = Category.objects.filter(blog=blog).annotate(c=Count("article")).values_list("title", "c")
    
    #标签列表
    tag_list = Tag.objects.filter(blog=blog).annotate(c=Count("article")).values_list("title", "c")

    #日期归档
    date_list = Article.objects.filter(user=user).extra(select={"standard_time":"strftime('%%Y-%%m',create_time)"}).values("standard_time").annotate(c=Count("title")).values_list("standard_time","c")
    print("date_list==>", date_list)

    return {"username":username, "blog":blog, "cate_list":cate_list, "tag_list":tag_list, "date_list":date_list}

调用这个函数:

def article_detail(request, username, article_id):

    context = get_data(username)

    return render(request, "article_detail.html", context)

视图标签 inclusion_tag

Django过滤器和标签功能很强大,而且支持自定义标签,很是方便;其中一种标签是Inclusion tags 包含标签(Inclusion tags)通过渲染其他的模板来展示内容, 这类标签的用途在于一些相似的内容的展示,并且返回的内容是渲染其他模板得到的内容。

在app中创建templatetags模块(模块名只能是templatetags) 在templatetags目录中建任意 .py 文件,如:my_tags.py 举例: my_tags.py中

from django import template
from blog.models import *


register = template.Library()

**最终返回给调动者的是menu.html渲染完之后的结果
@register.inclusion_tag("menu.html")  #把下面函数返回的数据交给menu.html进行渲染
def get_query_data(username):  #函数用于处理逻辑
    print("username==>", username)
    # 查当前站点的用户对象
    user = UserInfo.objects.filter(username=username).first()

    # 查询当前站点对象
    blog = user.blog

    # 查询每一个分类的名称以及对应的文章数
    from django.db.models import Count
    # 分类列表
    cate_list = Category.objects.filter(blog=blog).annotate(c=Count("article")).values_list("title", "c")

    # 标签列表
    tag_list = Tag.objects.filter(blog=blog).annotate(c=Count("article")).values_list("title", "c")

    # 日期归档
    date_list = Article.objects.filter(user=user).extra(
        select={"standard_time": "strftime('%%Y-%%m',create_time)"}).values("standard_time").annotate(
        c=Count("title")).values_list("standard_time", "c")
    print("date_list==>", date_list)

    return {"username": username, "blog": blog, "cate_list": cate_list, "tag_list": tag_list, "date_list": date_list}

html(模板)中

        <div class="col-md-3">
             #调用my_tags
            {% load my_tags %}
             #把username传给my_tags.py中的get_query_data函数,此处显示的结果就是menu.html渲染完之后的结果
            {% get_query_data username %}
        </div>

menu.html中

<div>
    {#            分类#}
    <div class="panel panel-warning">
    <div class="panel-heading">
        <h3 class="panel-title">我的分类</h3>
    </div>
    <div class="panel-body">
        {% for cate in cate_list %}
    {#                    /blog/dzm/cate/爬虫#}
        <p><a rel="nofollow" href="/blog/{{ username }}/cate/{{ cate.0 }}">{{ cate.0 }}({{ cate.1 }})</a></p>
        {% endfor %}

    </div>
    </div>
    {#            标签#}
    <div class="panel panel-danger">
    <div class="panel-heading">
        <h3 class="panel-title">标签</h3>
    </div>
    <div class="panel-body">
        {% for tag in tag_list %}
        <p><a rel="nofollow" href="/blog/{{ username }}/tag/{{ tag.0 }}">{{ tag.0 }}({{ tag.1 }})</a></p>
        {% endfor %}

    </div>
    </div>
    {#            日期归档#}
    <div class="panel panel-info">
    <div class="panel-heading">
        <h3 class="panel-title">日期归档</h3>
    </div>

    <div class="panel-body">
        {% for date in date_list %}
        <p><a rel="nofollow" href="/blog/{{ username }}/achrive/{{ date.0 }}">{{ date.0 }}({{ date.1 }})</a></p>
        {% endfor %}

    </div>
    </div>
</div>