发布文章功能做好了,统一显示在每个球队页面的上面
不过如果时间长了以后,关于球队的文章会越来越多,所以势必需要用到分页功能
Django内置了分页的功能,是Paginator类
我们来看一下官方文档中关于Paginator的说明
class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
第一个参数是需要给到一个可切片对象,而第二个参数per_page则就是字面意思,每页显示多少个这个对象中的元素。
另外一个非常关键的参数就是orphans,他的作用是,当你最后一页显示的元素非常少的时候,他可以帮你把这几个元素归并到前一页去做成“最后一页”,比如这个数值是3,那么当最后一页的元素小于等于三的时候,他就会自动加到前一页的最末尾。
完了我们来修改一下team这个app的views文件
def team_page(request,team_id):
team_name = Team.objects.get(team_id=team_id)
team_articles = Article.objects.filter(team_id=team_id)
paginator = Paginator(team_articles,4) #通过过滤出来的文章,生成分页对象
page = request.GET.get('page') #具体显示哪一页的内容,根据url里面的page参数来进行定位
contacts = paginator.get_page(page) #根据定位出来的页码,生成当页的内容
if request.method == "GET":
article_form = ArticleForm()
elif request.method == 'POST':
form = ArticleForm(request.POST)
f = form.save(commit=False)
f.user = request.user
f.team_id = team_id
f.save()
#print (f)
return redirect('team:team_page',team_id=team_id)
return render(request,'team_page.html',locals())
随后,我们也需要修改一下前端渲染的页面,需要注意的是,显示的文章内容,和按钮的显示,是分开区域设定的。
文章标题的显示,需要从contacts,也就是分页对象中进行迭代获取,而不是之前的article对象。另外在按钮的显示上,也需要进行逻辑判断,是否有前一页和后一页,至于是否有前一页和后一页,完全是根据你输入给Paginator的参数来自动计算的。
<ul>
{% for i in contacts %}
<li><a href="{% url 'team:article_detail' i.article_id %}">{{i.article_title}}</a></li>
{% endfor %}
</ul>
{% if contacts.has_previous %}
<a href="?page=1">«first</a>
<a href="?page={{contacts.previous_page_number}}">previous</a>
{% endif %}
<span>Page {{contacts.number}}of{{contacts.paginator.num_pages}}</span>
{% if contacts.has_next %}
<a href="?page={{ contacts.next_page_number }}">next</a>
<a href="?page={{ contacts.paginator.num_pages }}">last »</a>
{% endif %}
让我们来看下效果图
参考文档:https://docs.djangoproject.com/en/2.1/topics/pagination/