Django нумерация страниц зависит от порядка - PullRequest
1 голос
/ 18 февраля 2020

У меня есть следующая модель (упрощенно):

class Post(models.Model):
    title = models.CharField(max_length=20)
    date_created = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('-date_created',) # note the "reverse" ordering here

, затем мой пользовательский DetailView на основе generic.DetailView:

class PostDetailView(generic.DetailView):
    queryset = Post.objects.all()

и, наконец, следующий шаблон:

{% with object.get_previous_by_date_created as prev %}
    {% if prev %}
    <a class="nav-link-prev"
       href="{% url "blog:post_detail" pk=prev.id %}">Previous</a>
    {% endif %}
{% endwith %}

{% with object.get_next_by_date_created as next %}
    {% if next %}
    <a class="nav-link-next"
       href="{% url "blog:post_detail" pk=next.id %}">Next</a>
    {% endif %}
{% endwith %}

Моя нумерация страниц, реализованная таким образом, работает, но из-за поля обратного упорядочения (т. Е. -date_created) его метки «Предыдущая / Следующая» не на месте. Другими словами, мой шаблон выводит «Назад», где должно быть «Далее», и наоборот. Если я уберу знак - в ordering = ('-date_created',), он будет работать нормально, но это не тот порядок, который я хотел бы иметь на своем веб-сайте.

Существует ли простой и идиоматический c способ исправить это? плохое поведение? Чего мне не хватает?

Ответы [ 3 ]

0 голосов
/ 18 февраля 2020

Я думаю, вы должны использовать DetailView с mixin MultipleObjectMixin, как показано ниже ...

from django.views.generic.detail import DetailView
from django.views.generic.list import MultipleObjectMixin
from django.core import paginator

class PostDetailView(DetailView, MultipleObjectMixin):
    model = Post
    paginate_by = 5

    def get_context_data(self, **kwargs):
        object_list = Post.objects.all().order_by('-date_created')
        context = super(PostDetailView, self).get_context_data(object_list=object_list, **kwargs)
        post_paginator = paginator.Paginator(object_list, self.paginate_by)
        # Catch invalid page numbers
        try:
            post_page_obj = post_paginator.page(purchases_page)
        except (paginator.PageNotAnInteger, paginator.EmptyPage):
            post_page_obj = post_paginator.page(1)

        context["post_page_obj"] = post_page_obj
        return context

Теперь вы должны иметь возможность использовать метод нумерации страниц с post_page_obj переменная

0 голосов
/ 18 февраля 2020

Я прошел этот путь и смог решить проблему:

class PostDetailView(generic.DetailView):
    model = Post

    def get_context_data(self, **kwargs):
        context = super(PostDetailView, self).get_context_data(**kwargs)

        next = Post.objects.filter(pk__lt=self.object.pk).order_by('-pk')[:1]
        prev = Post.objects.filter(pk__gt=self.object.pk).order_by('pk')[:1]
        if prev:
            context['prev'] = prev[0]
        if next:
            context['next'] = next[0]

        return context

сейчас в шаблоне. html:

{% if prev %}
<a class="nav-link-prev"
   href="{% url "post_detail" pk=prev.id %}">Previous
</a>
{% endif %}

{% if next %}
    <a class="nav-link-next"
       href="{% url "post_detail" pk=next.id %}">Next
    </a>
{% endif %}

Что вы думаете об этом подходе?

0 голосов
/ 18 февраля 2020

Добавить

ordering = ['-date_created']

или

ordering = Post._meta.ordering

до PostListView

...