Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Pagination Django Templates

+3 votes

Actuellement, j'ai cette pagination dans mon template sous django :

                                <ul class="pagination">
                                {% if page_obj.has_previous %}
                                    <li><a title="Première page" href="{% url 'liste_concours' %}">««</a></li>
                                <li>

                                    {% if page_obj.number == 2 %}
                                    <a title="Page précédente" href="{% url 'liste_concours' %}">«</a>

                                    {% else %}
                                    <a title="Page précédente" href="?page={{page_obj.previous_page_number}}">«</a>
                                    {% endif %}
                                </li>
                                {% endif %}

                                {% for maPage in paginator.page_range %}
                                <li>
                                    {% if maPage == 1 %}
                                    <a href="{% url 'liste_concours' %}" title="Page {{maPage}}" >{{maPage}}</a>
                                    {% else %}
                                    <a href="?page={{maPage}}" title="Page {{maPage}}">{{maPage}}</a>
                                    {% endif %}
                                </li>
                                {% endfor %}

                                {% if page_obj.has_next %}
                                    <li><a title="Page suivante" href="?page={{page_obj.next_page_number}}">»</a></li>
                                    <li><a title="Dernière page" href="?page={{paginator.num_pages}}">»»</a></li>
                                {% endif %}
                            </ul>

Elle fonctionne très bien, sauf qu'une fois rendu à plus de 10 pages, çà commence à faire beaucoup de boutons !

Je cherche un système de pagination qui affiche toujours 10 pages sur la page visitée, avec des boutons contenant 3 petits points si on souhaite voir les pages suivantes.

J'espère avoir été assez clair dans mon explication :)

demandé 3-Jul-2015 par ronan (188 points)
edité 3-Jul-2015 par boblinux

Je me suis permis d'éditer ta question pour enlever le

merci d'avance

sur IE on aime bien aller droit au but ;)

il faut ajouter un if dans ton else qui permette de gerer ce cas de figure, le else qui est dans la boucle sur page_range

Okey, un début d'algo ou des précisions supplémentaires ? :)

heu non, il faut se triturer les méninges dans l"'immediat je n'ai pas les temps, j'ai juste pointé où je le ferai ;)

Petites questions, python2 ou python3? Mais surtout, quelles sont les options que t'as deja testées? Parce qu'en cherchant un peu sur la toile, on trouve des trucs pouvant etre tres interessants

Python 3 ! J'ai regardé les différentes solutions, mais souvent il y a des soucis de version ou alors ce n'est plus maj ...

J'ai fait mon propre code en créant un filtre :

@register.filter
def substract(value, arg):
value = int(value)
arg = int(arg)
return value - arg

Code HTML (dans la boucle sur page_range) :

{% for maPage in paginator.page_range %}

    {% if maPage == 1 %}
        <li {% ifequal maPage page_obj.number %}class="active"{% endifequal %}><a href="{{current_path}}{% if mot_clef %}?mot-clef={{mot_clef}}{% endif %}" title="Page {{maPage}}" >{{maPage}}</a></li>
    {% elif maPage == paginator.num_pages %}
        <li {% ifequal maPage page_obj.number %}class="active"{% endifequal %}><a href="{{current_path}}?page={{paginator.num_pages}}{% if mot_clef %}&mot-clef={{mot_clef}}{% endif %}" title="Page {{maPage}}" >{{maPage}}</a></li>
    {% else %}                               
        {% if maPage|substract:page_obj.number >= -3 and  maPage|substract:page_obj.number <= 3 %}
            <li {% ifequal maPage page_obj.number %}class="active"{% endifequal %}><a href="{{current_path}}?page={{maPage}}{% if mot_clef %}&mot-clef={{mot_clef}}{% endif %}" title="Page {{maPage}}">{{maPage}}</a></li>
        {% elif maPage|substract:page_obj.number == -4 or  maPage|substract:page_obj.number == 4 %}
            <li {% ifequal maPage page_obj.number %}class="active"{% endifequal %}><a href="{{current_path}}?page={{maPage}}{% if mot_clef %}&mot-clef={{mot_clef}}{% endif %}" title="Page {{maPage}}">. . .</a></li>
        {% endif %}
    {% endif %}

{% endfor %}

Il s'agit d'un code générique pour la pagination, la variable currentpath est un contextprocessor.
C'est un peu de la bidouille mais çà fonctionne !

1 Réponse

0 votes

Salut, tu peux utiliser l'application pure-pagination de django, c'est un drop in replacement du module de pagination de l'ORM.

Un example :

from pure_pagination import Paginator, EmptyPage

def paginate(queryset, page_nb, article_per_page):
"""
Returns :
 * a page (a slice of the queryset), with the asked number of articles, at the right offset.
 * the featured article if the first page is asked or None otherwise
Note: we use pure_pagination to handle all the complex stuff
"""

featured = None
if page_nb == 1:
    featured = queryset[:1]
    featured = featured[0] if len(featured) > 0 else None

queryset = queryset[1:]
paginator = Paginator(queryset, article_per_page)

try:
    paginated = paginator.page(page_nb)
except EmptyPage:
    # If page is out of range (e.g. 9999), deliver last page of results.
    paginated = paginator.page(paginator.num_pages)

return paginated, featured

Et le template :

<div class="text-center">
   <nav>
     <ul class="pagination">
         % if articles.has_previous():
         <li class="page-item">
      <a class="page-link" href="?p=${articles.previous_page_number()}" aria-label="Previous">
        <span aria-hidden="true">&laquo;</span>
        <span class="sr-only">Previous</span>
      </a>
    </li>
  %endif

  %for page in articles.pages():
    %if page is not None:
      % if page == articles.number:
       <li class="active"><a href="?p=${page}">${page}</a></li>
      %else:
      <li><a href="?p=${page}">${page}</a></li>
      %endif
    %else:
      <li><span>...</span></li>
    %endif
  %endfor

  % if articles.has_next():
    <li class="page-item">
      <a class="page-link" href="?p=${articles.next_page_number()}" aria-label="Next">
        <span aria-hidden="true">&raquo;</span>
        <span class="sr-only">Next</span>
      </a>
    </li>
  % endif
</ul>


répondu 26-Avr-2016 par ice3
...