文章的日期归档
涉及到三个知识点
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>