项目作者: sujeetkv

项目描述 :
Paginator to generate page numbers for pagination
高级语言: Python
项目地址: git://github.com/sujeetkv/py-paginator.git
创建时间: 2018-08-16T12:55:45Z
项目社区:https://github.com/sujeetkv/py-paginator

开源协议:MIT License

下载


py-paginator

Paginator to generate page numbers for pagination

Build Status
PyPI Version

Installation

  1. pip install py-paginator

Usage Example with flask framework

  • app.py
  1. from flask import Flask, request, render_template
  2. from py_paginator import Paginator
  3. app = Flask(__name__)
  4. app.jinja_env.add_extension('jinja2.ext.do')
  5. @app.route('/')
  6. def home():
  7. page = int(request.args.get('page', 1))
  8. limit = 20
  9. records_count = get_records_count() # get records count from storage
  10. paginator = Paginator(total_items=records_count, item_limit=limit, curr_page=page)
  11. records = get_records(limit=paginator.item_limit, offset=paginator.item_offset) # get records from storage
  12. return render_template('home.html', records=records, paginator=paginator)

Here paginator.item_limit and paginator.item_offset can be used in database query to apply limit. paginator object can be used in templates to create pagination links.

  • templates/macros.html
  1. {#
  2. :paginator: Paginator object
  3. :endpoint: flask request endpoint
  4. :pager: If True it will show a pager instead of numbered pagination
  5. - you can also pass further arguments that will be passed into `url_for()` of every link.
  6. #}
  7. {% macro render_pagination(paginator, endpoint=request.endpoint, pager=False) %}
  8. {% if paginator.has_pages %}
  9. {% do kwargs.update(request.args) %}
  10. {% do kwargs.pop('page', None) %}
  11. <nav aria-label="Page navigation">
  12. {% if pager %}
  13. {% set pager = paginator.get_pager() %}
  14. <ul class="pager">
  15. <li class="previous{% if not paginator.has_prev %} disabled{% endif %}">
  16. {% do kwargs.update({'page': pager.prev}) %}
  17. <a href="{% if paginator.has_prev %}{{ url_for(endpoint, **kwargs) }}{% else %}#{% endif %}"><span aria-hidden="true">«</span> Prev</a>
  18. </li>
  19. <li class="next{% if not paginator.has_next %} disabled{% endif %}">
  20. {% do kwargs.update({'page': pager.next}) %}
  21. <a href="{% if paginator.has_next %}{{ url_for(endpoint, **kwargs) }}{% else %}#{% endif %}">Next <span aria-hidden="true">»</span></a>
  22. </li>
  23. </ul>
  24. {% else %}
  25. <ul class="pagination">
  26. {% for page_type, page_num in paginator.get_pages() %}
  27. {% do kwargs.update({'page': page_num}) %}
  28. {% if page_type == 'prev' %}
  29. {% if page_num %}
  30. <li><a href="{{ url_for(endpoint, **kwargs) }}" aria-label="Previous"><span aria-hidden="true">«</span></a></li>
  31. {% else %}
  32. <li class="disabled"><span><span aria-hidden="true">«</span></span></li>
  33. {% endif %}
  34. {% elif page_type == 'next' %}
  35. {% if page_num %}
  36. <li><a href="{{ url_for(endpoint, **kwargs) }}" aria-label="Next"><span aria-hidden="true">»</span></a></li>
  37. {% else %}
  38. <li class="disabled"><span><span aria-hidden="true">»</span></span></li>
  39. {% endif %}
  40. {% elif page_type == 'ellip' %}
  41. <li class="disabled"><span><span aria-hidden="true"></span></span></li>
  42. {% elif page_type == 'curr' %}
  43. <li class="active"><span>{{ page_num }}</span></li>
  44. {% else %}
  45. <li><a href="{{ url_for(endpoint, **kwargs) }}">{{ page_num }}</a></li>
  46. {% endif %}
  47. {% endfor %}
  48. </ul>
  49. {% endif %}
  50. </nav>
  51. {% endif %}
  52. {% endmacro %}
  • templates/home.html
  1. {% from "macros.html" import render_pagination with context %}
  2. <h1>Total Records: {{ paginator.total_items }}</h1>
  3. <h2>Total Pages: {{ paginator.total_pages }}</h2>
  4. {% for record in records %}
  5. <p>{{ loop.index + paginator.item_offset }} - {{ record.field_name }}</p>
  6. {% else %}
  7. <p>No Records found.</p>
  8. {% endfor %}
  9. {{ render_pagination(paginator) }}