Django NBA Web开发 - Step 7 文章分页

发布文章功能做好了,统一显示在每个球队页面的上面
不过如果时间长了以后,关于球队的文章会越来越多,所以势必需要用到分页功能
Django内置了分页的功能,是Paginator类
我们来看一下官方文档中关于Paginator的说明


Django NBA Web开发 - Step 7 文章分页_第1张图片
官方文档说明

class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
第一个参数是需要给到一个可切片对象,而第二个参数per_page则就是字面意思,每页显示多少个这个对象中的元素。
另外一个非常关键的参数就是orphans,他的作用是,当你最后一页显示的元素非常少的时候,他可以帮你把这几个元素归并到前一页去做成“最后一页”,比如这个数值是3,那么当最后一页的元素小于等于三的时候,他就会自动加到前一页的最末尾。

Django NBA Web开发 - Step 7 文章分页_第2张图片
orphans

完了我们来修改一下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的参数来自动计算的。

    

    {% if contacts.has_previous %}
        «first
        previous
    {% endif %}
    Page {{contacts.number}}of{{contacts.paginator.num_pages}}
    {% if contacts.has_next %}
            next
            last »
        {% endif %}

让我们来看下效果图


Django NBA Web开发 - Step 7 文章分页_第3张图片
效果图

参考文档:https://docs.djangoproject.com/en/2.1/topics/pagination/

你可能感兴趣的:(Django NBA Web开发 - Step 7 文章分页)