如何在Django中创建分页?

时间:2015-04-18 03:48:02

标签: django pagination

我遵循djangoproject.com的这份文件:https://docs.djangoproject.com/en/1.8/topics/pagination/。但这太简单了。它只是下一个和上一个按钮。

现在我希望创建具有更多功能的分页,例如http://i.imgur.com/ZiFeAqG.jpg

这是代码:

View.py

def hire(request):

hire_article_list = hire_article.objects.all().order_by('-id')
#hire_article_list = hire_article.objects.order_by("-publication_date")

paginator = Paginator(hire_article_list, 2) # Show 25 contacts per page

page = request.GET.get('page')
try:
    hire_article_s = paginator.page(page)

except PageNotAnInteger:
    # If page is not an integer, deliver first page.
    hire_article_s = paginator.page(1)
except EmptyPage:
    # If page is out of range (e.g. 9999), deliver last page of results.

    hire_article_s = paginator.page(paginator.num_pages)

#return render_to_response('hire/list.html', {"page_list": page_list})
context = {'hire_article_s': hire_article_s}
return render(request, 'hire/list.html', context)

list.html

{% for j in hire_article_s %}
    {# Each "j" is a page_list  model object. #}
    <li><a href="/hire/{{ j.slug }}-{{j.id}}">{{ j.hiring}}</a></li>
{% endfor %}

            

                {% if hire_article_s.has_previous %}
                    <a href="?page={{ hire_article_s.previous_page_number }}">previous</a>
                {% endif %}

                <span class="current">
                    Page {{ hire_article_s.number }} of {{ hire_article_s.paginator.num_pages }}.
                </span>

                {% if hire_article_s.has_next %}
                    <a href="?page={{ hire_article_s.next_page_number }}">next</a>
                {% endif %}

        </span>
</div>

1 个答案:

答案 0 :(得分:1)

上周我有类似的需求,并发现这个超级有用的要点(https://gist.github.com/jsatt/8183993)工作正常(虽然我不确定为什么在我将函数参数中的请求放入之前它不会起作用)。它是django的Paginator函数的子类。您可以将它放在一个实用程序文件中,并在需要使用带有范围的Paginate时调用它。

例如,我有一个名为utils.py的文件,它位于我的核心应用程序中。

<强> views.py

from core.utils import paginate

def hire(request):

    hire_article_list = hire_article.objects.all().order_by('-id')
    '''
    Show 25 contacts per page, with a page range of 5, which means if you are
    on page 8, it shows links to pages 6,7,8,9,10.
    '''
    hire_article_s = paginate(request, hire_article_list, 25, 5) 

    context = {'hire_article_s': hire_article_s}
    return render(request, 'hire/list.html', context)

<强> list.html

{% if hire_article_s.has_previous %}
     <a href="?page={{ hire_article_s.previous_page_number }}">previous</a>
{% endif %}

{% for range in hire_article_s.neighbor_range %}
    {% if range == hire_article_s.number %}
       <li class="pagination__item active ">{{ range }}</li>
    {% else %}
       <li class="{% if range == hire_article_s.number %}active {% endif %}"><a href="?page={{ range }}">{{ range }}</a></li>
    {% endif %}
{% endfor %} 

{% if hire_article_s.has_next %}
    <a href="?page={{ hire_article_s.next_page_number }}">next</a>
{% endif %}

希望这有帮助。

<强>更新

上面的代码已经编辑了一下。我添加了上下文和模板格式。请注意,我正在使用循环来浏览{{ hire_article_s.neighbor_range }}并打印出页码。我也会检查以突出显示当前页面的编号。这应该有用,因为它几乎是我自己的代码和你自己的变量名。