Comment utiliser la pagination avec les ListViews génériques basées sur les classes Django?

Comment utiliser la pagination avec Django 1.3?

La documentation n’est pas très claire à ce sujet.

  • Qu’est-ce qui va à mes views.py ?

  • Qu’est-ce qui va à mon modèle?

  • Qu’est-ce qui se passe dans mon fichier URLconf?

Je pense que vous demandez des informations sur l’utilisation de la pagination avec les nouvelles vues basées sur les classes car, avec les vues basées sur les fonctions traditionnelles, elles sont faciles à trouver. J’ai trouvé que le simple réglage de la variable paginate_by suffit pour activer la pagination. Voir dans les vues génériques basées sur les classes .

Par exemple, dans vos 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's inner Meta class paginate_by = 10 #and that's it !! 

Dans votre modèle ( car_list.html ), vous pouvez inclure une section de pagination comme celle-ci (nous avons des variables de contexte disponibles: is_paginated , page_obj et paginator ).

 {# .... **Normal content list, maybe a table** .... #} {% if car_list %}  {% for car in car_list %}  {% endfor %} 
{{ car.model }} {{ car.year }} detail
{# .... **Now the pagination section** .... #} {% if is_paginated %} {% endif %} {% else %}

My Cars

No cars found!!! :(

{% endif %} {# .... **More content, footer, etc.** .... #}

La page à afficher est indiquée par un paramètre GET, en ajoutant simplement ?page=n à l’URL.

Je suppose que j’ai une classe dans app / models.py nommée FileExam(models.Model) :

app / 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) 

app / 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 

seulement un petit changement dans le get_context_data et ajouté le code de pagination de la documentation de Django ici

app / templates / app / exam_list.html

liste de contenu normale

  {% for exam in list_exams %}  {% endfor %} 
{{ exam.myfile }} {{ exam.date }} .....

paginer la section

 {% if is_paginated %} 
    {% if page_obj.has_previous %}
  • Previous
  • {% endif %}
  • Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
  • {% if page_obj.has_next %}
  • Next
  • {% endif %}
{% else %}

Your File Exam

File not yet available

{% endif %}

app / urls.py

 urlpatterns = [ url( r'^$', views.FileExamListView.as_view(), name='file-exam-view'), ), ... ]