Domanda

Al momento sto sviluppando un'applicazione Django che farà uso della tecnica famigerato "impaginazione". Sto cercando di capire come funziona il modulo django.core.paginator.

Ho una domanda con un modello di domanda. Sarò elenca tutte le domande utilizzando questo Paginator. Ci saranno 20 domande per pagina.

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 })

Nella visualizzazione, in cui elenco le diverse pagine come "... 2, 3, 4 , 5, 6, ..." Voglio evidenziare la pagina corrente in qualche modo, come molti pagine fanno.

Ci sono due cose che voglio sapere:

  1. Come faccio a fare Django capire quale pagina la questione si trova in?
  2. Come potrei scrivere il mio modello correttamente "evidenziare" la pagina attualmente visitata?

EDIT: Scusa, ho dimenticato parte di questa domanda. Vorrei anche qualsiasi pagina, ad eccezione di quello attuale sia un collegamento a /questions/{{ that_page.start_index }}. Quindi, in pratica ogni pagina link potrebbe creare un collegamento alla prima domanda in quella pagina.

È stato utile?

Soluzione

Hmm ... vedo dal tuo commento che non si vuole fare il parametro ol' GET, che è quello che è stato scritto django.core.paginator per l'utilizzo. Per fare quello che vuoi, non posso pensare a un modo migliore rispetto alla precompute pagina che ogni domanda è su. A titolo di esempio, la visualizzazione finirà per essere qualcosa del tipo:

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 })

Per evidenziare la pagina corrente nel modello, devi fare qualcosa di simile

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

Per quanto riguarda le voci, avrete due object_lists diversi di lavorare con ...

page.object_list

saranno gli oggetti nella pagina corrente e

page.paginator.object_list

saranno tutti gli oggetti, indipendentemente dalla pagina. Ognuno di questi elementi avranno una variabile "pagina" che vi dirà quale pagina sono su.

Che tutti Detto questo, quello che stai facendo suoni non convenzionali. Si consiglia di ripensare, ma in ogni modo, buona fortuna.

Altri suggerimenti

Django, almeno a partire dalla versione 1.2, ci permette di completare questo attività utilizzando puro tag modello impaginazione di default.

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

Dove article_list è istanza di

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

django-pagination dovrebbe fare ciò che si vuole e viene avvolto in un bel pacchetto si può semplicemente plug-in ed usare. Si muove essenzialmente il codice dal vostro punto di vista ai modelli e un middleware.

EDIT: Ho appena visto la tua modifica. È possibile ottenere gli oggetti correnti in una pagina utilizzando {% autopaginate object_list %}, che sostituisce object_list con gli oggetti correnti per ogni pagina. È possibile eseguire iterazioni e se si desidera che il primo, si dovrebbe essere in grado di trattarla come una lista e fare object_list[0].

Se si desidera mantenere questo all'interno vostro punto di vista, si potrebbe fare qualcosa di simile:

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

Entro il modello, è possibile accedere alla pagina corrente si è in facendo:

# 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

Con questo, si dovrebbe essere in grado di fare tutto ciò che serve. Ci sono un paio di buoni esempi qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top