Представление на основе классов в 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

Вот пример моих моделей для некоторого контекста:

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 '#'.")
    ...

Конечно, следуя документации Django, система разбивки на страницы работает, когда представление определяется примерно так: def view(request):

Мне также интересно, как я могу вытащить следующий и предыдущий объекты.

Мне понадобится ссылка на «следующую проблему (с контекстом имени и номера проблемы)», а затем ссылку на «предыдущую проблему». Обратите внимание, что просто изменить ссылку шаблона на следующий или предыдущий номер вопроса не получится.

Так что, если кто-то может мне помочь, это было бы здорово.


person AAA    schedule 16.05.2011    source источник


Ответы (2)


Просто добавьте paginate_by = 20 к вашему классу просмотра.

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

    #More stuff here..
person Evan Porter    schedule 16.05.2011
comment
Это работает, но как теперь передать это через шаблон? Например: Page {{ issue.number }} of {{ issue.paginator.num_pages }}. {% if issue.has_previous %} &laquo; <a href="?page={{issue.previous_page_number }}">Previous</a> {% endif %} {% if issues.has_next %}| <a href="?page={{ issue.next_page_number }}">Next</a> &raquo; {% endif %} не работает.. - person AAA; 16.05.2011
comment
Контекстная переменная page_obj будет содержать необходимую информацию. То есть page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}, page_obj.has_previous. Также есть контекстная переменная is_paginated для проверки наличия нумерации страниц. - person Evan Porter; 16.05.2011
comment
да, это ключевая недостающая деталь при ответе на этот вопрос;) - person defbyte; 20.04.2012
comment
Можно ли изменить paginate_by с помощью переменной request.GET? - person Natim; 25.09.2012
comment
@Natim Есть функция get_paginate_by, которую вы можете определить для возврата нестандартных размеров страницы. - person WhyNotHugo; 02.06.2015

Как прокомментировал Эван Портер, вы можете использовать контекстную переменную page_obj для доступа к number, paginatior.num_pages, has_next, has_previous. Это то, что только что спасло меня от KeyError['page'] после обновления с Django 1.4.1 до 1.7, object_list to ListView

person AJNinja    schedule 24.10.2014