Django学习教程(十六)实现上下篇文章跳转

Django学习教程(十六)实现上下篇文章跳转

前言

  上一篇我们实现了文章详情页面,可以点击列表中的文章进入详情页。这一篇我们继续完善详情页,实现上一篇和下一篇文章跳转。

  在博客网站中,文章详情页经常会有上一篇、下一篇按钮,这样用户可以更加方便地浏览文章。

1.查询当前文章

当前文章还是根据id查询。

代码:

复制代码
article = Article.objects.get(id=article_id)

2.查询上一篇文章

上一篇文章可以理解为id比当前文章小,并且离当前文章最近的一篇。

代码:

复制代码
prev_article = Article.objects.filter(id__lt=article_id).order_by('-id').first()

id__lt表示id小于当前文章id。

order_by('-id')表示倒序排列。

first()表示取第一条数据。

3.查询下一篇文章

下一篇文章可以理解为id比当前文章大,并且离当前文章最近的一篇。

代码:

复制代码
next_article = Article.objects.filter(id__gt=article_id).order_by('id').first()

id__gt表示id大于当前文章id。

4.修改详情视图

views.py代码:

复制代码
from django.shortcuts import render
from .models import Article


def article_detail(request, article_id):
    article = Article.objects.get(id=article_id)

    prev_article = Article.objects.filter(id__lt=article_id).order_by('-id').first()
    next_article = Article.objects.filter(id__gt=article_id).order_by('id').first()

    context = {
        'article': article,
        'prev_article': prev_article,
        'next_article': next_article
    }

    return render(request, 'blog/article_detail.html', context)

5.修改详情模板

article_detail.html中添加上一篇和下一篇。

代码:

复制代码
<div class="mt-4">
    {% if prev_article %}
        <a href="/article/{{ prev_article.id }}/" class="btn btn-outline-primary">
            上一篇:{{ prev_article.title }}
        </a>
    {% else %}
        <span class="btn btn-outline-secondary disabled">没有上一篇了</span>
    {% endif %}

    {% if next_article %}
        <a href="/article/{{ next_article.id }}/" class="btn btn-outline-primary">
            下一篇:{{ next_article.title }}
        </a>
    {% else %}
        <span class="btn btn-outline-secondary disabled">没有下一篇了</span>
    {% endif %}
</div>

6.访问测试

进入某一篇文章详情页,如果前后都有文章,就会显示上一篇和下一篇按钮。

如果当前文章已经是第一篇,就显示没有上一篇了。

如果当前文章已经是最后一篇,就显示没有下一篇了。

7.总结

  这一篇我们实现了文章详情页中的上一篇和下一篇功能,主要用到了Django ORM中的filter、order_by和first方法。

  这个功能可以让博客文章之间跳转更加方便。好了这一篇就到这里,下一篇我们继续学习分页功能,如果对你有帮助,点赞加关注,下篇见。