2009-11-27 4 views
0

J'utilise ce code pour ma pagination, et je voudrais que le choix de l'utilisateur soit persistant sur tout le site (cela a été résolu jusqu'à présent) ... le seul problème est maintenant que la variable de session maintenant est permanent jusqu'à la fin de la session en fermant le navigateur. Aussi, comment puis-je obtenir les pages adjacentes affichées ... comme dans le paginateur Django de style digg. Je n'ai pas réussi à comprendre comment implémenter ceci dans mon code.Problème de pagination

Le code est le suivant:

from django.core.paginator import Paginator, InvalidPage, EmptyPage 

def paginate(request, object_list, paginate_by=10): 
    try: 
     if "per_page" in request.session: 
     per_page = request.session["per_page"] 
     else: 
     request.session["per_page"] = int(request.REQUEST['p']) 
     per_page = request.session["per_page"] 
     request.session.set_expiry(0) 
    except: 
     per_page = 10 

    paginator = Paginator(object_list, per_page) 

    try: 
     page = int(request.GET.get('page', '1')) 
    except ValueError: 
     page = 1 

    try: 
     items = paginator.page(page) 
    except (EmptyPage, InvalidPage): 
     items = paginator.page(paginator.num_pages) 

    return items 

Puis, dans mon modèle, j'ai ceci à rendre les liens Pagination:

<div class="pagination" align="center"> 
<span class="step-links"> 
    {% if items.has_previous %} 
    <a href="?page={{ items.previous_page_number }}">previous</a> 
    {% endif %} 
    <span class="current"> 
    Page {{ items.number }} of {{ items.paginator.num_pages }} 
    </span> 
    {% if items.has_next %} 
    <a href="?page={{ items.next_page_number }}">next</a> 
    {% endif %} 
</span> 
</div> 

Répondre

0

Vous pouvez y parvenir en permettant aux sessions.

Je recommande de lire le chapitre Sessions, Users, and Registration sur le site Web de djangobook. Modifier: Maintenant que vous avez activé les sessions, je pense que le problème réside dans les liens hypertexte du modèle. Utilisez une esperluette pour séparer plusieurs paramètres dans une URL, par exemple

<a href="?p={{ request.session.per_page }}&page={{ items.next_page_number }}">next</a> 

Edit 2: Je ne sais pas si je comprends ce que le problème est à l'expiration de la session. La ligne qui définit la session pour expirer lorsque le navigateur se ferme est request.session.set_expiry(0). Voir les docs django sur Using Sessions in views si vous voulez changer cela.

Pour créer un paginateur de style Digg, vous devez écrire une fonction qui prend le numéro de page en cours et le nombre total de pages, et renvoie une liste de numéros de page. Ensuite, dans le modèle, parcourez les numéros de pages et construisez des liens vers les pages.

Une liste des listes de numéros de page vous permettrait de diviser les numéros de page en groupes, par exemple

[[1,2], [20,21,22,23,24], [30,31]]

+0

pensait aussi ... je voulais juste savoir s'il n'y avait pas d'autres moyens – Stephen

+0

J'ai essayé le code ci-dessus mais je dois avoir obtenu quelque chose de mal ... maintenant la pagination ne fonctionne pas (sauf la première page) ... ce que j'ai manqué ou omis – Stephen

+0

Je ne peux pas regarder votre code juste maintenant. Si vous ne répondez pas à la question (cliquez sur la coche verte) et modifiez votre question pour expliquer ce que vous avez essayé de faire, cela attirera probablement plus d'attention de la part d'autres personnes. – Alasdair