功能增加:如图
实现方法:filter方法,方法如下:
修改views.py中的内容:
然后修改blog\_detail.html的显示结构和内容:
效果如图:
但现在希望如果上一篇和下一篇没有的话写没有了,下一篇同样,另外希望上下篇可以点击,修改blog\_detail.html内容如下:
效果如下:
修改新增的blog-more的样式在blog.css中:
div.blog-more{
margin-top:1 em;
}
新功能增加:添加新的分类,可以按年/月分类,点开后是对应时间内的所有博文
先写url的匹配地址:
localhost.8000/date/2019/3 来访问2019年3月的所有博文
修改blog\_list.html中的内容:
然后从数据库中拿取数据:修改views.py中的blog\_list函数:
接着修改blog\_list.html中的日期归档内容:
效果如下:
去掉前面的点:base.css,并将日期哪里变成超链接:base.css
* {
margin: 0;
padding: 0;
}
body {
margin-top: 70px!important;
}
ul {
list-style-type: none!important;
}
效果如图:
bug:日期归档里面还有点,去除失败!
添加点击日期归档内容后的视图函数:
def blogs_with_date(request,year,month):
"""
localhost.8000/date/2019/3 来查询2019年3月的所有博文,复制上面的内容,修改局部内容
"""
context = {}
# 按照要求的时间来查询博客内容
blogs_all_list = Blog.objects.filter(created_time__year=year, created_time__month=month)
paginator = Paginator(blogs_all_list, settings.EACH_PAGE_BLOGS_NUMBER)
page_num = request.GET.get('page', 1) # 获取url的页码参数(GET请求)
page_of_blogs = paginator.get_page(page_num)
currentr_page_num = page_of_blogs.number # 获取当前页码
# 获取当前页面前后各2页的页码范围
page_range = list(range(max(currentr_page_num - 2, 1), currentr_page_num)) + \
list(range(currentr_page_num, min(currentr_page_num + 2, paginator.num_pages) + 1))
# 加上省略页码标记
if page_range[0] - 1 >= 2:
page_range.insert(0, '...')
if paginator.num_pages - page_range[-1] >= 2:
page_range.append('...')
# 加上首页和尾页
if page_range[0] != 1:
page_range.insert(0, 1)
if page_range[-1] != paginator.num_pages:
page_range.append(paginator.num_pages)
context = {}
context['blogs_with_date'] = '%s年%s月' % (year,month) # 15节新加
context['blogs'] = page_of_blogs.object_list
context['page_of_blogs'] = page_of_blogs
context['page_range'] = page_range
context['blog_types'] = BlogType.objects.all()
context['blog_dates'] = Blog.objects.dates('created_time','month',order='DESC')
return render(request, 'blog/blogs_with_date.html', context)
然后创建blogs\_with\_date.html文件(基本和blogs\_with\_type.html文件一样,唯一区别在于左上角的博客列表改成“xx年xx月的博客";
{% extends 'blog/blog_list.html' %}
{% block title %}{{ blog_type.type_name }}{% endblock %}
{% block blog_list_title %}
日期分类:{{ blogs_with_date }}
<a href="{% url 'blog_list' %}">查看全部博客</a>
{% endblock %}
现在可以点击日期归档中的内容了,但是代码有太多重复的内容了,需要精简一下:将共同的内容放在一个函数中,其他的调用一下即可!
views.py全部代码如下
from django.shortcuts import render, get_object_or_404
from django.core.paginator import Paginator
from django.conf import settings
from .models import Blog, BlogType
def get_blogs_list_common_data(request, blogs_all_list):
paginator = Paginator(blogs_all_list, settings.EACH_PAGE_BLOGS_NUMBER)
page_num = request.GET.get('page', 1) # 获取url的页码参数(GET请求)
page_of_blogs = paginator.get_page(page_num)
currentr_page_num = page_of_blogs.number # 获取当前页码
# 获取当前页面前后各2页的页码范围
page_range = list(range(max(currentr_page_num - 2, 1), currentr_page_num)) + \
list(range(currentr_page_num, min(currentr_page_num + 2, paginator.num_pages) + 1))
# 加上省略页码标记
if page_range[0] - 1 >= 2:
page_range.insert(0, '...') # 0表示位置,后面的省略号表示要插入的内容
if paginator.num_pages - page_range[-1] >= 2:
page_range.append('...') # 使用append来将省略号插入到页码的最后
# 加上首页和尾页
if page_range[0] != 1:
page_range.insert(0, 1)
if page_range[-1] != paginator.num_pages:
page_range.append(paginator.num_pages)
context = {}
context['blogs'] = page_of_blogs.object_list
context['page_of_blogs'] = page_of_blogs
context['page_range'] = page_range
context['blog_types'] = BlogType.objects.all()
context['blog_dates'] = Blog.objects.dates('created_time', 'month', order="DESC")
return context
def blog_list(request):
blogs_all_list = Blog.objects.all()
context = get_blogs_list_common_data(request, blogs_all_list)
return render(request,'blog/blog_list.html', context)
def blogs_with_type(request, blog_type_pk):
blog_type = get_object_or_404(BlogType, pk=blog_type_pk)
blogs_all_list = Blog.objects.filter(blog_type=blog_type)
context = get_blogs_list_common_data(request, blogs_all_list)
context['blog_type'] = blog_type
return render(request,'blog/blogs_with_type.html', context)
def blogs_with_date(request, year, month):
"""
localhost.8000/date/2019/3 来查询2019年3月的所有博文,复制上面的内容,修改局部内容
"""
blogs_all_list = Blog.objects.filter(created_time__year=year, created_time__month=month)
context = get_blogs_list_common_data(request, blogs_all_list)
context['blogs_with_date'] = '%s年%s月' % (year, month) # 15节新加
return render(request,'blog/blogs_with_date.html', context)
def blog_detail(request, blog_pk):
"""
打开某一个博文后的显示内容
"""
context = {}
blog = get_object_or_404(Blog, pk=blog_pk)
# 上一条博客:创建时间大于当前打开博客的创建时间的所有博文,在使用last取其中最后一条博文
context['previous_blog'] = Blog.objects.filter(created_time__gt=blog.created_time).last()
# 下一条博文同理
context['next_blog'] = Blog.objects.filter(created_time__lt=blog.created_time).first()
context['blog'] = blog
return render(request,'blog/blog_detail.html', context)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。