Paginator 分页功能

Django原生分页

HTML代码:

//数据获取
{% for host in page_obj %}
    <tr>
        <td>{{ forloop.counter }}</td>
        <td target="host_id" style="display: none">{{ host.id }}</td>
        <td target="host_name">{{ host.hostname }}</td>
        <td target="host_address">{{ host.address }}</td>
        <td>{{ host.business }}</td>
        <td class="col-md-3">
            <button class="btn btn-primary host-edit" data-toggle="modal" data-target="#EditModal"><i class="fa fa-edit"></i>Edit</button>
            <a href="{% url "host_edit" host.id %}" class="btn btn-default"><i class=" fa fa-refresh "></i>Edit</a>
            <a href="{% url "host_delete" host.id %}" class="btn btn-danger"><i class="fa fa-pencil"></i>Delete</a>
        </td>
    </tr>
{% endfor %}


//分页
    <div class="paginator col-md-offset-6">
        {% if page_obj.has_previous %}
            <a href="?p={{ page_obj.previous_page_number }}">上一页</a>
        {% else %}
            没有上一页
        {% endif %}

        {% for i in page_obj.paginator.page_range %}
            <a href="?p={{ i }}">{{ i }}</a>
        {% endfor %}

        {% if page_obj.has_next %}
            <a href="?p={{ page_obj.next_page_number }}">下一页</a>
        {% else %}
            没有下一页
        {% endif %}
    </div>
View Code

 

 

第三方库分页功能

django-pure-pagination库: https://github.com/jamespacileo/django-pure-pagination

第一步: pip install django-pure-pagination

第二步: INSTALLED_APPS = ( ... 'pure_pagination', )

第三步: 编写views.py

第四步: 编写html

 

View代码:

from pure_pagination import Paginator, EmptyPage, PageNotAnInteger

class BookListView(View):
    """
    图书列表
    """
    def get(self, request):
        current_category = request.GET.get('category')
        all_category = BookDict.objects.all()
        all_books = Book.objects.all()
        # 分类显示功能
        category_id = request.GET.get("category", "")
        if category_id:
            all_books = all_books.filter(category_id=int(category_id))

        # 分页功能
        try:
            page = request.GET.get("page", 1)
        except PageNotAnInteger:
            page = 1
        p = Paginator(all_books, 10, request=request)
        all_books = p.page(page)
        return render(request, "book_list.html", {
            "book_category": all_category,
            "all_books": all_books,
            "current_category": current_category
})
View Code

html代码:

<ul class="pager">

    {% if all_books.has_previous %}
        <li class="long"><a href="?{{ all_books.previous_page_number.querystring }}">上一页</a></li>
    {% endif %}

    {% for page in all_books.pages %}
        {% if page %}
            {% ifequal page all_books.number %}
                <li class="active"><a href="?{{ page.querystring }}">{{ page }}</a></li>
            {% else %}
                <li><a href="?{{ page.querystring }}" class="pager">{{ page }}</a></li>
            {% endifequal %}
        {% else %}
            <li class="none"><a href="">...</a></li>
        {% endif %}
    {% endfor %}
    {% if all_books.has_next %}
        <li class="long"><a href="?{{ all_books.next_page_number.querystring }}">下一页</a></li>
    {% endif %}
 
</ul>
View Code

 

 

自定义分页功能 

自定义pagenator类

"""
使用方法:
    all_count = Models.objects.all().count()
    paginator = Paginator(request.GET.get("p"), 10, all_count, request.path_info)
    queryset = Models.objects.all()[paginator.start: paginator.end]
"""


class Paginator(object):
    def __init__(self, current_page, per_page_number, all_data_count, base_url, page_range=5):
        """
        :param current_page: 当前页
        :param per_page_number: 每页显示的数据条数
        :param all_data_count: 数据库中数据的总条数
        :param base_url: 页面的前缀
        :param page_range: 页码的显示范围
        """
        try:
            current_page = int(current_page)
        except Exception:
            current_page = 1
        self.current_page = current_page
        self.per_page_number = per_page_number
        self.all_data_count = all_data_count
        self.base_url = base_url
        self.page_range = page_range
        a, b = divmod(all_data_count, per_page_number)
        if b == 0:
            self.all_page = a
        else:
            self.all_page = a + 1

    @property
    def start(self):
        return (self.current_page - 1) * self.per_page_number

    @property
    def end(self):
        return self.current_page * self.per_page_number

    def page_str(self):
        """
        在HTML页面中显示页码标签
        :return:
        """
        page_html = []

        # 上一页逻辑
        if self.current_page <= 1:
            prev = '<li><a href="#">首页</a></li>'
        else:
            prev = '<li><a href="%s?p=%s">上一页</a></li>' % (self.base_url, self.current_page - 1)
        page_html.append(prev)

        # 页码逻辑
        if self.all_page <= self.page_range:
            start = 1
            end = self.all_page + 1
        else:
            if self.current_page > int(self.page_range / 2):
                if (self.current_page + int(self.page_range / 2)) > self.all_page:
                    start = self.all_page - self.page_range + 1
                    end = self.all_page + 1
                else:
                    start = self.current_page - int(self.page_range / 2)
                    end = self.current_page + int(self.page_range / 2) + 1
            else:
                start = 1
                end = self.page_range + 1
        for i in range(start, end):
            if self.current_page == i:
                page_number = '<li class="active"><a href="%s?p=%s">%s</a></li>' % (self.base_url, i, i)
            else:
                page_number = '<li><a href="%s?p=%s">%s</a></li>' % (self.base_url, i, i)
            page_html.append(page_number)

        # 下一页逻辑
        if self.current_page >= self.all_page:
            nex = '<li><a href="#">尾页</a></li>'
        else:
            nex = '<li><a href="%s?p=%s">下一页</a></li>' %(self.base_url, self.current_page + 1)
        page_html.append(nex)

        return "&nbsp;&nbsp;".join(page_html)
View Code

 

html代码

<!--  //页码部分-->
<div class="col-md-offset-4">
    <ul class="pagination">
        {{ paginator.page_str|safe }}
    </ul>
</div>
View Code

 

posted @ 2017-05-17 15:53  Vincen_shen  阅读(265)  评论(0)    收藏  举报