diff --git a/django/views/generic/dates.py b/django/views/generic/dates.py index 3da05cf8e5..4380cd5464 100644 --- a/django/views/generic/dates.py +++ b/django/views/generic/dates.py @@ -485,10 +485,14 @@ class BaseWeekArchiveView(YearMixin, WeekMixin, BaseDateListView): date_field = self.get_date_field() week_format = self.get_week_format() - week_start = { - '%W': '1', - '%U': '0', - }[week_format] + week_choices = {'%W': '1', '%U': '0'} + try: + week_start = week_choices[week_format] + except KeyError: + raise ValueError('Unknown week format %r. Choices are: %s' % ( + week_format, + ', '.join(sorted(week_choices)), + )) date = _date_from_string(year, self.get_year_format(), week_start, '%w', week, week_format) diff --git a/tests/generic_views/test_dates.py b/tests/generic_views/test_dates.py index 2daac10b31..8cd2b2a8be 100644 --- a/tests/generic_views/test_dates.py +++ b/tests/generic_views/test_dates.py @@ -528,6 +528,10 @@ class WeekArchiveViewTests(TestDataMixin, TestCase): self.assertEqual(res.status_code, 200) self.assertEqual(res.context['week'], datetime.date(2008, 9, 29)) + def test_unknown_week_format(self): + with self.assertRaisesMessage(ValueError, "Unknown week format '%T'. Choices are: %U, %W"): + self.client.get('/dates/books/2008/week/39/unknown_week_format/') + def test_datetime_week_view(self): BookSigning.objects.create(event_date=datetime.datetime(2008, 4, 2, 12, 0)) res = self.client.get('/dates/booksignings/2008/week/13/') diff --git a/tests/generic_views/urls.py b/tests/generic_views/urls.py index f2af8ad1a3..8fbcbbc8cb 100644 --- a/tests/generic_views/urls.py +++ b/tests/generic_views/urls.py @@ -182,6 +182,10 @@ urlpatterns = [ path('dates/books//week//paginated/', views.BookWeekArchive.as_view(paginate_by=30)), path('dates/books//week/no_week/', views.BookWeekArchive.as_view()), path('dates/books//week//monday/', views.BookWeekArchive.as_view(week_format='%W')), + path( + 'dates/books//week//unknown_week_format/', + views.BookWeekArchive.as_view(week_format='%T'), + ), path('dates/booksignings//week//', views.BookSigningWeekArchive.as_view()), # DayArchiveView