¿Cómo uso la paginación con Django 1.3?
La documentación no es muy clara al respecto.
¿Qué le pasa a mi
views.py
?¿Qué va a mi plantilla?
¿Qué va a mi archivo URLconf?
Creo que solicita información sobre el uso de la paginación con las nuevas vistas basadas en clases, ya que, con vistas tradicionales basadas en funciones, es fácil de encontrar. Descubrí que solo configurando la paginate_by
variable es suficiente para activar la paginación. Ver en vistas genéricas basadas en clases .
Por ejemplo, en tu 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 !!
En su plantilla ( car_list.html
), puede incluir una sección de paginación como esto (tenemos algunas variables de contexto disponibles: is_paginated
, page_obj
, y 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.** .... #}
La página para mostrar se indica mediante un parámetro GET, simplemente agregando ?page=n
, a la URL.
supongo que tengo una clase en app / models.py llamada
FileExam(models.Model)
:app / models.py
app / views.py
Solo un pequeño cambio en el
get_context_data
código de paginación agregado de la documentación de django aquíapp / templates / app / exam_list.html
lista de contenido normal
sección paginada
app / urls.py
fuente
context = super(SoalListView, self)...
. ¿Quiso decircontext = super(FileExamListView, self)...
:?Tenemos 2 métodos para hacer esto.
El primero es simple y solo establece el campo de clase
paginate_by
. Nada tiene que ver con elget_context_data
método.El segundo método es un poco complicado, pero podemos obtener una mayor comprensión acerca de la paginación y personalizar la paginación compleja o varias paginación. Vamos a verlo.
Se puede hacer en tres pasos.
1.
get_context_data
Método de anulación de suView
.Pase
page_keys
ypages
para que podamos iterar las listas y evitar la codificación rígida.2.Personaliza tu sub
template
.Definimos algunas variables para que podamos recorrer la lista de paginación.
pagination.html
3. Personalizar exterior
template
.index.html
fuente