Django分页 - 如何限制页面?

时间:2015-05-31 15:21:41

标签: django django-templates

我正在使用此代码在我的页面上显示分页

            <ul class="pagination pagination-sm">
                {% if restaurants.has_previous %}
                    <li><a href="?page={{ restaurants.previous_page_number }}">Prev</a></li>
                {% endif %}
                {% for page in restaurants.paginator.page_range %}
                    <li class="{% if restaurants.number == page %}active{% endif %}"><a
                            href="?page={{ page }}">{{ page }}</a></li>
                {% endfor %}

                {% if restaurants.has_next %}
                    <li><a href="?page={{ restaurants.next_page_number }}">Next</a></li>
                {% endif %}
            </ul>

问题是上面的代码显示了这样的所有页面:

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | and so on..

相反,我想展示这样的东西:

1 | 2 | 3 | 4 | 5

我该怎么做?

这是我的观点:

def listing(request):
    list_restaurants = ShopAccount.objects.filter(is_active=1)
    # only active products
    paginator = Paginator(list_restaurants, 20)  # Show 20 products per page

    page = request.GET.get('page')
    try:
        restaurants = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        restaurants = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        restaurants = paginator.page(paginator.num_pages)

    return render_to_response('restaurants/list.html', {'restaurants': restaurants}, context_instance=RequestContext(request))

2 个答案:

答案 0 :(得分:1)

我使用这样的东西:

<li {% ifequal page current %}class="active"{% endifequal %}>
  <a href={% ifequal page -4 %}
     "/blog/1/">&lt;&lt;
    {% else %}{% ifequal page -3 %}
     "/blog/{{ current | add:"-1" }}/">&lt;
    {% else %}{% ifequal page -2 %}
    "/blog/{{ current | add:"1" }}/">&gt;
    {% else %}{% ifequal page -1 %}
    "/blog/{{ maximum }}/">&gt;&gt;
    {% else %}{% ifequal page 0 %}
    "#">...
    {% else %}{% ifequal page current %}
    "#" class="page_link">{{ page }}
    {% else %}
     "/blog/{{ page }}/">{{ page }}
    {% endifequal %}
    {% endifequal %}
    {% endifequal %}
    {% endifequal %}
    {% endifequal %}
    {% endifequal %}
  </a>
</li>

和这些观点:

def makepaginator(current, maximum):
    """makepaginator() returns a set of number which reprensents buttons.                                                                                                                                                                    
    -4 means first page.                                                                                                                                                                                                                     
    -3 means previous page.                                                                                                                                                                                                                  
    -2 means next page.                                                                                                                                                                                                                      
    -1 means last page.                                                                                                                                                                                                                      
    0 means a dot.                                                                                                                                                                                                                           
    others means the number of the target page."""

    NB_PAGES_LEFT_LEFT = 3
    NB_PAGES_RIGHT_RIGHT = NB_PAGES_LEFT_LEFT
    NB_PAGES_CENTER_RIGHT = 3
    NB_PAGES_CENTER_LEFT = NB_PAGES_CENTER_RIGHT
    i = 2
    current = int(current)
    if current > 1:
    p = [-4, -3]
    else:
        p = []
    p.append(1)
    while i <= maximum:
        if (i > NB_PAGES_LEFT_LEFT and i < maximum - NB_PAGES_RIGHT_RIGHT
            and (i - current > NB_PAGES_CENTER_RIGHT
                 or current -  i > NB_PAGES_CENTER_RIGHT + 1)):
            p.append(0)
            while (i > NB_PAGES_LEFT_LEFT
                   and i < maximum - NB_PAGES_RIGHT_RIGHT
                   and (i - current > NB_PAGES_CENTER_RIGHT
                        or current - i > NB_PAGES_CENTER_LEFT + 1)):
                i += 1
        else:
            p.append(i)
        i += 1
    if current < maximum:
        p.append(-2)
        p.append(-1)
    return (p)

def news(request, page_num=1):
    paginator = Paginator(Article.objects.all().order_by('-date'), settings.ARTICLES_PER_PAGE)
    try :
        page = paginator.page(page_num)
    print(type(page_num))
        return (render(request, "main/blog.html",
                       {"paginator" : paginator, "page_num" : int(page_num),
                        "page" : page,
                        "buttons" : makepaginator(page_num,
                                                  paginator.num_pages)}))
    except (PageNotAnInteger, EmptyPage) as e:
        return (notfound(request))

使用bootstrap我得到这个: pagination

它可能看起来很脏,但它适用于我的网站。你可以尝试一下。 如果你有一些改进建议,我会很高兴。 :)

答案 1 :(得分:0)

ShopAccount.objects.filter(is_active=1)[:5]

请尝试以上代码,或使用分页器上的[:5]。