Question

Je développe actuellement une application Django qui utilisera la technique de la tristement célèbre « pagination ». J'essaie de comprendre comment fonctionne le module django.core.paginator.

J'ai une application avec un modèle de question. Je vais énumérer toutes les questions à l'aide de cette paginator. Il y aura 20 questions par page.

def show_question(question_pk):
    questions = Question.objects.all()
    paginator = Paginator(questions, 20)
    page      = ... # Somehow figure out which page the question is on
    return render_to_response('show_question.html', { 'page' : page })

Dans la vue, où je liste les différentes pages comme "... 2, 3, 4 , 5, 6, ..." Je veux mettre en évidence la page en cours en quelque sorte, comme beaucoup pages font.

Il y a vraiment deux choses que je veux savoir:

  1. Comment puis-je faire Django comprendre quelle page la question se trouve à?
  2. Comment pourrais-je écrire mon modèle pour bien « highlight » la page actuellement visitée?

EDIT: Désolé, j'ai oublié une partie de cette question. Je voudrais également une page à l'exception de celui en cours d'être un lien vers /questions/{{ that_page.start_index }}. Donc, fondamentalement, tous les liens de la page relierait à la première question sur cette page.

Était-ce utile?

La solution

Hmm ... Je vois de votre commentaire que vous ne voulez pas faire le ol » paramètre GET, ce qui est ce que django.core.paginator a été écrit pour l'utilisation. Pour faire ce que vous voulez, je peux penser à un meilleur moyen que de précalculer la page que chaque question est activée. À titre d'exemple, votre point de vue finira par être quelque chose comme:

ITEMS_PER_PAGE = 20
def show_question(question_pk):
    questions = Question.objects.all()
    for index, question in enumerate(questions):
        question.page = ((index - 1) / ITEMS_PER_PAGE) + 1
    paginator = Paginator(questions, ITEMS_PER_PAGE)
    page = paginator.page(questions.get(pk=question_pk).page)
    return render_to_response('show_question.html', { 'page' : page })

Pour mettre en évidence la page en cours dans le modèle, vous feriez quelque chose comme

{% for i in page.paginator.page_range %}
    {% ifequal i page.number %}
        <!-- Do something special for this page -->
    {% else %}
        <!-- All the other pages -->
    {% endifequal %}
{% endfor %}

En ce qui concerne les articles, vous aurez deux object_lists différentes pour travailler avec ...

page.object_list

seront les objets dans la page courante et

page.paginator.object_list

sera tous les objets, quelle que soit la page. Chacun de ces éléments auront une « page » variable qui vous dira quelle page ils sont sur.

Que tous dit, ce que vous faites des sons non conventionnels. Vous voudrez peut-être repenser, mais de toute façon, bonne chance.

Autres conseils

Django, au moins de la version 1.2, nous permet de compléter cette tâche en utilisant les balises de modèle pur par défaut de pagination.

{% for page in article_list.paginator.page_range %}
  {% if page == article_list.number %}
    {{ page }}
  {% else %}
    <a href="/page{{ page }}">{{ page }}</a>
  {% endif %}
{% endfor %}

Où article_list est instance de

paginator = Paginator(article_list, 20)
    try:
        article_list = paginator.page(int(page))
    except (EmptyPage, InvalidPage):
        article_list = paginator.page(paginator.num_pages)

django- devrait faire la pagination ce que vous voulez et est enveloppé dans un joli paquet, vous pouvez simplement brancher et utiliser. Il se déplace essentiellement le code de vos vues sur les modèles et un middleware.

EDIT: Je viens de voir votre édition. Vous pouvez obtenir les objets en cours sur une page en utilisant {% autopaginate object_list %}, qui remplace object_list avec les objets actuels pour une page donnée. Vous pouvez itérer et si vous voulez que la première, vous devriez être en mesure de le traiter comme une liste et faire object_list[0].

Si vous voulez garder cela dans votre point de vue, vous pouvez faire quelque chose comme ceci:

def show_question(question_pk):
    questions = Question.objects.all()
    paginator = Paginator(questions, 20)
    return render_to_response('show_question.html', { 'page' : paginator })

Dans votre modèle, vous pouvez accéder à la page que vous êtes en faisant:

# Gives you the starting index for that page.
# For example, 5 objects, and you're on the second page. 
# start_index will be 3.
page.start_index

# You can access the current page number with:
# 1-based index
page.number

Avec cela, vous devriez être capable de faire tout ce dont vous avez besoin. Il y a quelques bons exemples .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top