Как разбить на страницы WeekArchiveView?
В продолжение моей борьбы с WeekArchiveView
как мне разбить на страницы по неделям?
Все, что я хочу, это:
- узнать, доступна ли следующая / предыдущая неделя;
- если есть, укажите ссылку в шаблоне.
Я бы тоже хотел пропустить пустые недели.
Источник показывает get_next_day
/ get_prev_day
а также get_next_month
/ get_prev_month
доступны, но ничего не для недели.
2 ответа
Это определенно интересно. Конечно же MonthMixin
включает в себя get_next_month
/get_prev_month
методы и DayMixin
включает в себя get_next_day
/get_prev_day
методы. Тем не менее, и YearMixin, и WeekMixin не имеют функционального эквивалента в своих определениях. Похоже на недосмотр со стороны команды Джанго.
Я думаю, что лучше всего подклассировать WeekArchiveView или BaseWeekArchiveView (если вы в конечном итоге захотите изменить формат ответа и не хотите повторно реализовывать свои методы) и добавить свой собственный get_next_week
/get_prev_week
методы. Тогда пусть ваш вид наследуется от вашего подкласса. Простая модификация DayMixin
Методы должны быть достаточными.
def get_next_week(self, date):
"""
Get the next valid week.
"""
next = date + datetime.timedelta(days=7)
return _get_next_prev_month(self, next, is_previous=False, use_first_day=False)
def get_previous_week(self, date):
"""
Get the previous valid week.
"""
prev = date - datetime.timedelta(days=7)
return _get_next_prev_month(self, prev, is_previous=True, use_first_day=False)
Взяв за основу код chrisdpratt, я создал класс, который предоставляет шаблону next_week
а также previous_week
:
class BetterWeekArchiveView(WeekArchiveView):
def get_next_week(self, date):
"""
Get the next valid week.
"""
next = date + timedelta(days=7)
return _get_next_prev_month(self, next, is_previous=False, use_first_day=False)
def get_previous_week(self, date):
"""
Get the previous valid week.
"""
prev = date - timedelta(days=7)
return _get_next_prev_month(self, prev, is_previous=True, use_first_day=False)
def get_dated_items(self):
"""
Return (date_list, items, extra_context) for this request.
Inject next_week and previous_week into extra_context.
"""
result = super(BetterWeekArchiveView, self).get_dated_items()
extra_context = result[2]
date = extra_context['week']
extra_context.update({
'next_week': self.get_next_week(date),
'previous_week': self.get_previous_week(date),
})
return result
Это работает отлично.