Как расширить общее представление архива года Django?

#django #datetime #view #django-generic-views

#django #datetime #Вид #django-generic-views

Вопрос:

Я использую общее представление архива года Django для отображения объектов событий по годам. Это может быть или не быть лучшим способом сделать это, поскольку я обнаружил, что Django ограничивает список объектов передаваемым годом; мой диапазон дат охватывает текущий год в следующий.

Вот мое мнение:

 class VisitingScholarsYearView(YearArchiveView):

    allow_empty = True
    allow_future = True
    date_field = 'event_date'
    template_name = "events/dvs_test.html"
    context_object_name = 'event_list'
    make_object_list = True

    def get_queryset(self):
            return Event.school_year_events.from_year(self.get_year()).filter(event_type__title='Distinguished Visiting Scholars Series')
  

Вот менеджер моей модели (объект события с полем даты, называемым event_date):

 class SchoolYearManager(models.Manager):
    def live_events(self, start_date, end_date):
        return self.filter(status=self.model.LIVE).filter(event_date__range=(start_date, end_date))

    def this_year(self):
        now = datetime.datetime.now()
        current_year = now.year
        start_date = datetime.date(current_year, 7, 1)
        end_date = datetime.date((current_year   1), 6, 30)
        return self.live_events(start_date, end_date)

def from_year(self, year):
        start_date = datetime.date(int(year), 7, 1)
        end_date = datetime.date((int(year)   1), 6, 30)
        return self.live_events(start_date, end_date)
  

И, наконец, мой URL-адрес для представления:

 url(r'^distinguished-visiting-scholars-series/(?P<year>d{4})/$', VisitingScholarsYearView.as_view()),
  

Когда я захожу в API, я получаю ожидаемые события. Но YearArchiveView, похоже, ограничивает возвращаемые события тем годом, который я ему даю; это также ожидается, но я бы хотел, чтобы оно охватывало диапазон, на который я ссылаюсь в менеджере (т.Е. С 1 июля по 30 июня). ).

Как я могу изменить это поведение? Или я должен попробовать другое представление (ListView)?

Ответ №1:

Я не думаю, что вы должны использовать YearArchiveView его в качестве основы здесь — слишком много встроенной логики вокруг получения объектов для этой даты.

Вместо этого используйте ListView с YearMixin :

 class VisitingScholarsYearView(YearMixin, ListView):
  

Комментарии:

1. YearMixin имеет смысл, но что я получаю от BaseDetailView? У меня нет slug или object pk для вызова. Как это будет выглядеть?

2. Да, я только что понял это. Отлично работает. Спасибо!