Как я могу использовать нумерацию страниц с базовыми ListViews на основе класса Django?

151

Как использовать разбиение на страницы с помощью Django 1.3?

Документация не очень понятна.

  • Что входит в мой views.py?

  • Что входит в мой шаблон?

  • Что входит в мой файл URLconf?

Теги:

2 ответа

260

Я думаю, что вы запрашиваете информацию об использовании разбиения на страницы с новыми классами, поскольку с традиционными функциями, основанными на просмотре, их легко найти. Я обнаружил, что просто установить переменную paginate_by достаточно, чтобы активировать разбиение на страницы. См. В Общие представления на основе классов.

Например, в views.py:

import models
from django.views.generic import ListView

class CarListView(ListView):
    model = models.Car      # shorthand for setting queryset = models.Car.objects.all()
    template_name = 'app/car_list.html'  # optional (the default is app_name/modelNameInLowerCase_list.html; which will look into your templates folder for that path and file)
    context_object_name = "car_list"    #default is object_list as well as model's_verbose_name_list and/or model's_verbose_name_plural_list, if defined in the model inner Meta class
    paginate_by = 10  #and that it !!

В вашем шаблоне (car_list.html) вы можете включить раздел разбиения на страницы как это (у нас есть некоторые доступные контекстные переменные: is_paginated, page_obj и paginator).

{# .... **Normal content list, maybe a table** .... #}
{% if car_list %}
    <table id="cars">
        {% for car in car_list %}
            <tr>
                <td>{{ car.model }}</td>
                <td>{{ car.year }}</td>
                <td><a href="/car/{{ car.id }}/" class="see_detail">detail</a></td>
            </tr>
        {% endfor %}
    </table>
    {# .... **Now the pagination section** .... #}
    {% if is_paginated %}
        <div class="pagination">
            <span class="page-links">
                {% if page_obj.has_previous %}
                    <a href="/cars?page={{ page_obj.previous_page_number }}">previous</a>
                {% endif %}
                <span class="page-current">
                    Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
                </span>
                {% if page_obj.has_next %}
                    <a href="/cars?page={{ page_obj.next_page_number }}">next</a>
                {% endif %}
            </span>
        </div>
    {% endif %}
{% else %}
    <h3>My Cars</h3>
    <p>No cars found!!! :(</p>
{% endif %}
{# .... **More content, footer, etc.** .... #}

Отображаемая страница указывается параметром GET, просто добавляя ?page=n к URL-адресу.

  • 1
    Это нормально, но как вы связываете шаблон, тоже видите объект "car_list"?
  • 0
    Я добавил пример шаблона
Показать ещё 11 комментариев
26

Предположим, у меня есть класс в app/models.py с именем FileExam(models.Model):

приложение /models.py

class FileExam(models.Model):
    myfile = models.FileField(upload_to='documents/%Y/%m/%d')
    date = models.DateTimeField(auto_now_add=True, blank=True)
    teacher_name = models.CharField(max_length=30)
    status = models.BooleanField(blank=True, default=False)

приложение /views.py

from app.models import FileExam
from django.core.paginator import Paginator
from django.core.paginator import EmptyPage
from django.core.paginator import PageNotAnInteger

class FileExamListView(ListView):
    model = FileExam
    template_name = "app/exam_list.html"
    paginate_by = 10


    def get_context_data(self, **kwargs):
        context = super(SoalListView, self).get_context_data(**kwargs) 
        list_exam = FileExam.objects.all()
        paginator = Paginator(list_exam, self.paginate_by)

        page = self.request.GET.get('page')

        try:
            file_exams = paginator.page(page)
        except PageNotAnInteger:
            file_exams = paginator.page(1)
        except EmptyPage:
            file_exams = paginator.page(paginator.num_pages)

        context['list_exams'] = file_exams
        return context

только небольшое изменение в get_context_data и добавлен код разбивки на страницы из документации django здесь

приложение/шаблоны/приложение/exam_list.html

обычный список содержимого

<table id="exam">
  {% for exam in list_exams %}
  <tr>
    <td>{{ exam.myfile }}</td>
    <td>{{ exam.date }}</td>
    <td>.....</td>
  </tr>
  {% endfor %}
</table>

раздел paginate

{% if is_paginated %}
<ul class="pagination">
{% if page_obj.has_previous %}
    <li>
        <span><a href="?page={{ page_obj.previous_page_number }}">Previous</a></span>
    </li>
{% endif %}
    <li class="">
        <span>Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.</span>
    </li>
{% if page_obj.has_next %}
    <li>
        <span><a href="?page={{ page_obj.next_page_number }}">Next</a></span>
    </li>
{% endif %}
</ul>
{% else %}
    <h3>Your File Exam</h3>
    <p>File not yet available</p>
{% endif %}

приложение /urls.py

urlpatterns = [
url(
    r'^$', views.FileExamListView.as_view(), name='file-exam-view'),
), 
... ]
  • 1
    Это выглядит неправильно: context = super(SoalListView, self)... Вы context = super(FileExamListView, self)... виду context = super(FileExamListView, self)... ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню