从零开始的django开发生活之上下篇博客和按月分类(9)

九、上下篇博客和按月分类

1、上一篇和下一篇博客

对比当前博客,得到上一篇或下一篇博客

2、filter筛选条件

常用查找类型

  • 等于:直接筛选
  • 大于:__gt(greater than)
  • 大于等于:__gte
  • 小于:__lt(less than)
  • 小于等于:__lte
  • 包含:__contains(加i忽略大小写)
  • 开头是:__startwith
  • 结尾是:__endswith
  • 其中之一:__in
  • 范围:__range

数字日期查询,使用前五个,下面写一下上下篇博客功能

在blog/views.py blog_detail()方法,加入查询结果

def blog_detail(request, blog_pk):
    context = {}
    blog = get_object_or_404(Blog, pk=blog_pk)
    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_to_response('blog/blog_detail.html', context)

blog_detail.html添加:

<div class="blog-more">
                    <p>
                        上一篇:
                        {% if previous_blog %}
                            <a href="{% url 'blog_detail' previous_blog.pk %}">
                                {{ previous_blog.title }}
                            </a>
                        {% else %}
                            没有了
                        {% endif %}
                    </p>
                    <p>
                        下一篇:
                        {% if next_blog %}
                            <a href="{% url 'blog_detail' next_blog.pk %}">
                                {{ next_blog.title }}
                            </a>
                        {% else %}
                            没有了
                        {% endif %}
                    </p>
                </div>

效果:

在这里插入图片描述
这里是以发表日期筛选的,那么为什么不用id筛选呢?因为我们排序是按照时间排序,而且id也可能是不连续的,在下面shell模式试验其他查询语句时就可以看出来。

字符串查询

在shell模式下实验其他查询

在这里插入图片描述

contains加 i 没有作用的原因是目前使用的数据库为sqlite,不支持

3、exclude排除条件

用法和filter一样,都是得到查询(QuerySet)

相当于filter条件取反

在这里插入图片描述

4、条件中的双下划线

字段查询类型

外键拓展(以博客分类为例)

日期拓展(以月份为例)

支持链式查询:可以一直链接下去

在这里插入图片描述这是日期的拓展

5、按月分类

正规的博客网站除了按照博客类别分类之外,还提供日期归档,按月分类的功能,下面我们一步步实现此功能

第一步,设计url

path('date/<int:year>/<int:month>', views.blogs_with_date, name='blogs_with_date'),

用户点击一个月份归档链接,需要传递两个数据,年份和月份

第二步,敲处理方法

def blogs_with_date(request, year, month):
	pass

代码内容先不写,首先从数据库中利用dates()方法取出年月份,下面是官方文档给出的说明

在这里插入图片描述

在blog_list()添加

context['blog_dates'] = Blog.objects.dates('created_time', 'month', order='DESC')

第三步,模板页面

<div class="panel panel-default">
                    <div class="panel-heading">日期归档</div>
                    <div class="panel-body">
                        <ul class="blog_types">
                            {% for blog_date in blog_dates %}
                                <li><a href="{% url 'blogs_with_date' blog_date.year blog_date.month %}">{{ blog_date|date:"Y年m月"}}</a></li>
                            {% endfor %}
                        </ul>
                    </div>
                </div>

补足blogs_with_date()方法

def blogs_with_date(request, year, month):
    blogs_all_list = Blog.objects.filter(created_time__year=year, created_time__month=month) #获取所有对象
    context = get_blog_list_common_data(request, blogs_all_list)
    context['blogs_with_date'] = '%s年%s月' % (year, month)
    return render_to_response('blog/blogs_with_date.html', context)

context = get_blog_list_common_data(request, blogs_all_list)是将几个方法共同的部分封装

Blog.objects.filter(created_time__year=year, created_time__month=month)中created_time__year=year, created_time__month=month引用了双下划线的扩展功能

def get_blog_list_common_data(request, blogs_all_list):
    paginator = Paginator(blogs_all_list, settings.BLOGS_NUMBER_OF_EACH_PAGE) #所有对象每十个一页进行分页
    page_num = int(request.GET.get('page', 1)) #获取url的页面参数,默认返回第1页
    page_of_blogs = paginator.get_page(page_num)
    # 第一种实现只显示当前页数和前后四页的方法
    # page_range = list(range(max(page_num - 2, 1), page_num)) + \
    # list(range(page_num, min(page_num + 2, paginator.num_pages)+1))
    #第二种实现只显示当前页数和前后四页的方法
    page_range = [i for i in range(page_num-2, page_num+3) if i in range(1, 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']  = page_of_blogs
    context['page_of_blogs'] = page_of_blogs
    context['page_range'] = page_range
    context['blog_count'] = Blog.objects.all().count()
    context['blog_types'] = BlogType.objects.all()
    context['blog_dates'] = Blog.objects.dates('created_time', 'month', order='DESC')
    return context
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值