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