loader777
@loader777
Python/django разработчик

Как сделать пагинацию в Django для моделей со связью один-ко -многим?

Делаю приложение афишы, Имеются следующие модели:

class Events(models.Model):
    title = models.CharField('Название мероприятия', max_length=255)

class Session(models.Model):
    event = models.ForeignKey(Events)
    date = models.DateField('Дата проведения мероприятия')


Задача вывести на страницу список мероприятий за определенную дату (показать время сеансов) и разбить на страницы.

Пошел таким путем:
1. Выбираем по дате сеансов мероприятия - по ним происходит пагинация.
2. По выбранным мероприятиям и дате выбираются сеансы и передаются в шаблон через контекст. И там выводятся через {% regroup %}.

Но сделать выборку сеансов с учетом пагинации не выходит.

class IndexView(generic.ListView):
    template_name = 'events/list.html'
    paginate_by = 1

    def get_queryset(self, **kwargs):
        date = datetime.today()
        return Events.objects.filter(session__date=date).distinct()

    def get_context_data(self, **kwargs):
        context = super(IndexView, self).get_context_data(**kwargs)
        date = datetime.today()
        context['session'] = Session.objects.filter(event=self.get_paginate_by(self), date=date)
        return context


В последствии нужно будет прикрутить выборку по категории мероприятия.

Подскажите - может вообще неверно логика выбрана.
  • Вопрос задан
  • 2734 просмотра
Пригласить эксперта
Ответы на вопрос 1
@deliro
model не переопределена.
get_queryset захардкожен.
get_context_data не нужен (в шаблон отправляется object_list, причём, только один).
{% for object in object_list %}
    {% for session in object.session_set.all %}
        {{ session }}
    {% endfor %}
{% endfor %}


Попробуйте:
class IndexView(ListView):
    template_name = 'events/list.html'
    paginate_by = 1
    model = Events

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).filter(session__date=datetime.today()).distinct()
        # Если python2, используйте super(IndexView, self) вместо super()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы