Pergunta

Atualmente estou desenvolvendo uma aplicação Django que irá fazer uso do infame técnica de "paginação". Eu estou tentando descobrir como funciona o módulo django.core.paginator.

Tenho uma aplicação com um modelo Pergunta. Eu vou estar listando todas as perguntas usando este paginador. Haverá 20 questões por página.

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

Na visualização, onde eu listar as diferentes páginas como "... 2, 3, 4 , 5, 6, ..." Quero destacar a página atual de alguma forma, como muitos páginas fazer.

Há realmente duas coisas que eu quero saber:

  1. Como posso fazer Django descobrir qual página a questão está localizado na?
  2. Como eu iria escrever o meu modelo para corretamente "destaque" a página atualmente visitados?

EDIT: Desculpe, esqueci-me parte desta questão. Eu também gostaria que qualquer página, exceto para o atual para ser um link para /questions/{{ that_page.start_index }}. Então, basicamente cada link da página ligaria para a primeira pergunta na página.

Foi útil?

Solução

Hmm ... Eu vejo do seu comentário que você não quer fazer o ol' GET parâmetro, que é o que django.core.paginator foi escrito para usar. Para fazer o que você quiser, eu posso pensar em nenhuma maneira melhor do que precompute a página que cada pergunta está ligado. Como exemplo, a sua visão vai acabar por ser algo como:

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

Para destacar a página atual no modelo, você faria algo como

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

Quanto aos itens, você terá duas object_lists diferentes para trabalhar com ...

page.object_list

serão os objetos na página atual e

page.paginator.object_list

estará todos os objetos, independentemente da página. Cada um desses itens terá uma variável "página" que irá dizer-lhe qual a página em que estão.

Isso tudo dito, o que está fazendo sons não convencionais. Você pode querer repensar, mas de qualquer forma, boa sorte.

Outras dicas

Django, pelo menos a partir da versão 1.2, permite-nos para completar esta tarefa usando as tags puros modelo de paginação padrão.

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

Onde article_list é instância de

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

django-pagination deve fazer o que você quer e vem embrulhado em um pacote bonito você pode apenas plug-in e usar. É essencialmente move o código a partir de seus pontos de vista para os modelos e um middleware.

EDIT: Eu só vi a sua edição. Você pode obter os objetos atuais em uma página usando {% autopaginate object_list %}, que substitui object_list com os objetos atuais para qualquer página. É possível percorrer-lo e se você quer o primeiro, você deve ser capaz de tratá-lo como uma lista e fazer object_list[0].

Se você quiser manter isso dentro de seus pontos de vista, você poderia fazer algo parecido com isto:

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

Dentro de seu modelo, você pode acessar a página atual estiver em fazendo:

# 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

Com isso, você deve ser capaz de fazer tudo o que você precisa. Há um par bons exemplos aqui .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top