2011-05-16 16 views
6

Estoy intentando paginar mi vista basada en clases. Aquí es cómo mi vista se ve:Vista basada en clases de Paginate en Django

class IssuesByTitleView(ListView): 
    context_object_name = "issue_list" 

    def issues(request): 
     issue_list = Issue.objects.all() 
     ###### Commented out does not work ###### 
     # paginator = Paginator(issue_list, 24) 
     # try: 
     # page = int(request.GET.get('page', '1')) 
     # except ValueError: 
     # page = 1 
     # try: 
     # issues = paginator.page(page) 
     # except (EmptyPage, InvalidPage): 
     # issues = paginator.page(paginator.num_pages) 

    def get_queryset(self): 
     self.title = get_object_or_404(Title, slug=self.kwargs['title_slug']) 
     return Issue.objects.filter(title=self.title).order_by('-number') 
    def get_context_data(self, **kwargs): 
     context = super(IssuesByTitleView, self).get_context_data(**kwargs) 
     context['title'] = self.title 
     return context 

aquí es una muestra de mis modelos para algún contexto:

class Title(models.Model): 
    CATEGORY_CHOICES = (
    ('Ongoing', 'Ongoing'),  
    ('Ongoing - Canceled', 'Ongoing - Canceled'), 
    ('Limited Series', 'Limited Series'), 
    ('One-shot', 'One-shot'), 
    ('Other', 'Other'), 
    )  
    title = models.CharField(max_length=64) 
    vol = models.IntegerField(blank=True, null=True, max_length=3) 
    year = models.CharField(blank=True, null=True, max_length=20, help_text="Ex) 1980 - present, 1980 - 1989.") 
    category = models.CharField(max_length=30, choices=CATEGORY_CHOICES)  
    is_current = models.BooleanField(help_text="Check if the title is being published where Emma makes regular appearances.") 
    slug = models.SlugField() 
    class Meta: 
     ordering = ['title'] 
    def get_absolute_url(self): 
     return "/titles/%s" % self.slug   
    def __unicode__(self): 

class Issue(models.Model): 
    title = models.ForeignKey(Title) 
    number = models.CharField(max_length=20, help_text="Do not include the '#'.") 
    ... 

Por supuesto, siguiendo la documentación de Django, el sistema de paginación funciona cuando se define la vista por algo como esto: def view(request):

También me pregunto cómo puedo sacar los objetos siguientes y anteriores.

Necesitaría un enlace al "próximo problema (con el contexto del nombre y el número de problema)" y luego un enlace de "problema anterior". Tenga en cuenta que simplemente cambiar el enlace de la plantilla con el número siguiente o anterior del problema no va a funcionar.

Entonces, si alguien puede ayudarme, sería genial.

Respuesta

15

Solo agrega paginate_by = 20 para ver la clase.

class IssuesByTitleView(ListView): 
    context_object_name = "issue_list" 
    paginate_by = 20 

    #More stuff here.. 
+2

Esto funciona, pero ¿cómo puedo pasarlo a través de la plantilla ahora? Por ejemplo: 'Página {{issue.number}} de {{issue.paginator.num_pages}}. {% if issue.has_previous%} « Previous {% endif%} {% if issues.has_next%} | Next » {% endif%} 'no funciona .. – AAA

+7

La variable de contexto' page_obj' tendrá la información que necesita. Es decir 'la página {{page_obj.number}} de {{page_obj.paginator.num_pages}}', 'page_obj.has_previous'. También existe la variable de contexto 'is_paginated' para verificar si hay paginación o no. –

+0

Sí, esa es una clave que falta al responder esta pregunta;) – defbyte

1

Al igual que Evan Porter ha comentado, se puede hacer uso de la variable page_obj contextual para acceder number, paginatior.num_pages, has_next, has_previous. Esto es lo que me acaba de salvar del KeyError['page'] después de actualizar de Django 1.4.1 a 1.7, object_list to ListView

Cuestiones relacionadas