ジェネリック日付ビュー¶
日付ベースのジェネリックビュー (django.views.generic.dates 内で提供されています) は、日付ベースのデータのために、ドリルダウンページを描画するためのビューです。
注釈
このページの例のいくつかは、myapp/models.py 内で下記の通り Article モデルが定義されていると仮定します:
from django.db import models
from django.urls import reverse
class Article(models.Model):
title = models.CharField(max_length=200)
pub_date = models.DateField()
def get_absolute_url(self):
return reverse("article-detail", kwargs={"pk": self.pk})
ArchiveIndexView¶
- class ArchiveIndexView[ソース]¶
"最新の"オブジェクトを、日付によって表示するトップレベルのインデックスページです。
allow_futureをTrueにセットしない限り、未来 の日付のオブジェクトは含まれません。継承元 (MRO)
コンテキスト
(
django.views.generic.dates.BaseDateListViewを通じた)django.views.generic.list.MultipleObjectMixinによって提供されたコンテキストに加えて、テンプレートのコンテキストは以下のようになります:date_list:querysetに従ってオブジェクトを利用可能にするすべての年を含むQuerySetオブジェクトです。datetime.datetimeオブジェクトとして表され、降順で表示されます。
ノート
デフォルトの
最新のcontext_object_nameを使います。デフォルトの
_archiveのtemplate_name_suffixを使います。年によって
date_listを提供する動作がデフォルトですが、date_list_period属性を用いた月や日に変更できます。これは、すべてのサブクラスのビューに適用されます。
例 myapp/urls.py:
from django.urls import path from django.views.generic.dates import ArchiveIndexView from myapp.models import Article urlpatterns = [ path( "archive/", ArchiveIndexView.as_view(model=Article, date_field="pub_date"), name="article_archive", ), ]
例 myapp/article_archive.html:
<ul> {% for article in latest %} <li>{{ article.pub_date }}: {{ article.title }}</li> {% endfor %} </ul>
これは、すべての記事 (article) を出力します。
YearArchiveView¶
- class YearArchiveView[ソース]¶
与えられた年の中で有効な月を表示する、年次のアーカイブページです。
allow_futureをTrueにセットしない限り、未来 の日付を伴うオブジェクトは表示されません。継承元 (MRO)
- make_object_list¶
この年のオブジェクトの全リストを取得し、テンプレートに渡すかどうかを指定する真偽値。もし
Trueなら、オブジェクトのリストがコンテキストで利用可能になります。Falseの場合、オブジェクトリストとしてNoneクエリセットが使用されます。デフォルトではFalseです。
- get_make_object_list()¶
オブジェクトリストをコンテキストの一部として返すかどうかを決定します。デフォルトでは
make_object_listを返します。
コンテキスト
(
django.views.generic.dates.BaseDateListViewを通じた)django.views.generic.list.MultipleObjectMixinによって提供されたコンテキストに加えて、テンプレートのコンテキストは以下のようになります:date_list:QuerySetオブジェクトで、datetime.datetimeオブジェクトとして昇順に表現された、querysetに従って利用可能なオブジェクトを持つ全ての月を含みます。year: 与えられた年を表すdateオブジェクト。next_year:allow_emptyとallow_futureに従って、次の年の最初の日を表すdateオブジェクト。previous_year:dateオブジェクト。allow_emptyとallow_futureに従います。
ノート
デフォルトの
template_name_suffixは_archive_yearです。
例 myapp/views.py:
from django.views.generic.dates import YearArchiveView from myapp.models import Article class ArticleYearArchiveView(YearArchiveView): queryset = Article.objects.all() date_field = "pub_date" make_object_list = True allow_future = True
例 myapp/urls.py:
from django.urls import path from myapp.views import ArticleYearArchiveView urlpatterns = [ path("<int:year>/", ArticleYearArchiveView.as_view(), name="article_year_archive"), ]
例 myapp/article_archive_year.html:
<ul> {% for date in date_list %} <li>{{ date|date }}</li> {% endfor %} </ul> <div> <h1>All Articles for {{ year|date:"Y" }}</h1> {% for obj in object_list %} <p> {{ obj.title }} - {{ obj.pub_date|date:"F j, Y" }} </p> {% endfor %} </div>
MonthArchiveView¶
- class MonthArchiveView[ソース]¶
与えられた月の中で有効な全オブジェクトを表示する、月次のアーカイブページです。
allow_futureをTrueにセットしない限り、未来 の日付を伴うオブジェクトは表示されません。継承元 (MRO)
コンテキスト
MultipleObjectMixin(BaseDateListView経由) によって提供されるコンテキストに加えて、テンプレートのコンテキストも提供されます:date_list:QuerySetオブジェクトで、querysetに従って、与えられた月にオブジェクトが利用可能な全ての日を、datetime.datetimeオブジェクトとして昇順で表します。month: 与えられた月を表すdateオブジェクト。next_month:allow_emptyとallow_futureに従って、次の月の最初の日を表すdateオブジェクト。previous_month:allow_emptyとallow_futureに従って、前月の最初の日を表すdateオブジェクト。
ノート
デフォルトの
template_name_suffixは_archive_monthです。
例 myapp/views.py:
from django.views.generic.dates import MonthArchiveView from myapp.models import Article class ArticleMonthArchiveView(MonthArchiveView): queryset = Article.objects.all() date_field = "pub_date" allow_future = True
例 myapp/urls.py:
from django.urls import path from myapp.views import ArticleMonthArchiveView urlpatterns = [ # Example: /2012/08/ path( "<int:year>/<int:month>/", ArticleMonthArchiveView.as_view(month_format="%m"), name="archive_month_numeric", ), # Example: /2012/aug/ path( "<int:year>/<str:month>/", ArticleMonthArchiveView.as_view(), name="archive_month", ), ]
例 myapp/article_archive_month.html:
<ul> {% for article in object_list %} <li>{{ article.pub_date|date:"F j, Y" }}: {{ article.title }}</li> {% endfor %} </ul> <p> {% if previous_month %} Previous Month: {{ previous_month|date:"F Y" }} {% endif %} {% if next_month %} Next Month: {{ next_month|date:"F Y" }} {% endif %} </p>
WeekArchiveView¶
- class WeekArchiveView[ソース]¶
与えられた週の中で有効な全オブジェクトを表示する、週次のアーカイブページです。
allow_futureをTrueにセットしない限り、未来 の日付を伴うオブジェクトは表示されません。継承元 (MRO)
コンテキスト
MultipleObjectMixin(BaseDateListView経由) によって提供されるコンテキストに加えて、テンプレートのコンテキストも提供されます:week: 指定した週の最初の日を表すdateオブジェクト。next_week:allow_emptyとallow_futureに従って、次の週の最初の日を表すdateオブジェクト。previous_week:allow_emptyとallow_futureに従って、前の週の最初の日を表すdateオブジェクト。
ノート
デフォルトの
template_name_suffixは_archive_weekです。week_format属性はstrptime()フォーマット文字列で、週番号をパースするために使用されます。以下の値がサポートされています:'%U': 日曜日が週の始まりとなるアメリカ合衆国の週システムに基づきます。これはデフォルト値です。'%W':'%U'と似ていますが、週が月曜日から始まると仮定している点が異なります。これはISO 8601の週番号とは異なります。'%V': 週が月曜日から始まるISO 8601の週番号。
例 myapp/views.py:
from django.views.generic.dates import WeekArchiveView from myapp.models import Article class ArticleWeekArchiveView(WeekArchiveView): queryset = Article.objects.all() date_field = "pub_date" week_format = "%W" allow_future = True
例 myapp/urls.py:
from django.urls import path from myapp.views import ArticleWeekArchiveView urlpatterns = [ # Example: /2012/week/23/ path( "<int:year>/week/<int:week>/", ArticleWeekArchiveView.as_view(), name="archive_week", ), ]
例 myapp/article_archive_week.html:
<h1>Week {{ week|date:'W' }}</h1> <ul> {% for article in object_list %} <li>{{ article.pub_date|date:"F j, Y" }}: {{ article.title }}</li> {% endfor %} </ul> <p> {% if previous_week %} Previous Week: {{ previous_week|date:"W" }} of year {{ previous_week|date:"Y" }} {% endif %} {% if previous_week and next_week %}--{% endif %} {% if next_week %} Next week: {{ next_week|date:"W" }} of year {{ next_week|date:"Y" }} {% endif %} </p>
この例では週番号を出力しています。 テンプレートフィルタの
dateが'W'フォーマット文字列で計算した週番号は、strftime()やstrptime()が'%W'フォーマット文字列で計算した週番号と必ずしも同じではないことに注意してください。例えば2015年の場合、dateが出力する週番号はstrftime()が出力する週番号よりも1つ大きくなります。dateには'%U'strftime()の書式文字列と等価なものはありません。そのため、dateを使ってWeekArchiveViewの URL を生成することは避けるべきです。
DayArchiveView¶
- class DayArchiveView[ソース]¶
与えられた日の中で有効な全オブジェクトを表示する、日次のアーカイブページです。
allow_futureをTrueにセットしない限り、未来の日付に対するオブジェクトがするかどうかにかかわらず、未来の日付は 404 エラーを返します。継承元 (MRO)
コンテキスト
MultipleObjectMixin(BaseDateListView経由) によって提供されるコンテキストに加えて、テンプレートのコンテキストも提供されます:day: 指定した日を表すdateオブジェクト。next_day:allow_emptyとallow_futureに従って、次の日を表すdateオブジェクト。previous_day:allow_emptyとallow_futureに従って、前日を表すdateオブジェクト。next_month:allow_emptyとallow_futureに従って、次の月の最初の日を表すdateオブジェクト。previous_month:allow_emptyとallow_futureに従って、前月の最初の日を表すdateオブジェクト。
ノート
デフォルトの
template_name_suffixは_archive_dayです。
例 myapp/views.py:
from django.views.generic.dates import DayArchiveView from myapp.models import Article class ArticleDayArchiveView(DayArchiveView): queryset = Article.objects.all() date_field = "pub_date" allow_future = True
例 myapp/urls.py:
from django.urls import path from myapp.views import ArticleDayArchiveView urlpatterns = [ # Example: /2012/nov/10/ path( "<int:year>/<str:month>/<int:day>/", ArticleDayArchiveView.as_view(), name="archive_day", ), ]
例 myapp/article_archive_day.html:
<h1>{{ day }}</h1> <ul> {% for article in object_list %} <li>{{ article.pub_date|date:"F j, Y" }}: {{ article.title }}</li> {% endfor %} </ul> <p> {% if previous_day %} Previous Day: {{ previous_day }} {% endif %} {% if previous_day and next_day %}--{% endif %} {% if next_day %} Next Day: {{ next_day }} {% endif %} </p>
TodayArchiveView¶
- class TodayArchiveView[ソース]¶
今日 の全てのオブジェクトを表示する、日時のアーカイブページです。
年/月/日引数の代わりに今日の日付が使われること以外は、django.views.generic.dates.DayArchiveViewとまったく同じです。継承元 (MRO)
ノート
デフォルトの
template_name_suffixは_archive_todayです。
例 myapp/views.py:
from django.views.generic.dates import TodayArchiveView from myapp.models import Article class ArticleTodayArchiveView(TodayArchiveView): queryset = Article.objects.all() date_field = "pub_date" allow_future = True
例 myapp/urls.py:
from django.urls import path from myapp.views import ArticleTodayArchiveView urlpatterns = [ path("today/", ArticleTodayArchiveView.as_view(), name="archive_today"), ]
TodayArchiveViewのテンプレート例はどこにありますか?このビューは、
DayArchiveViewと同じテンプレートをデフォルトで使用します。違うテンプレートが必要な場合は、template_name属性に新しいテンプレートの名前をセットしてください。
DateDetailView¶
- class DateDetailView[ソース]¶
個別のオブジェクトを表示するページです。オブジェクトが未来の日付値を持っている場合、
allow_futureをTrueにセットしない限り、デフォルトでビューは 404 エラーを返します。継承元 (MRO)
コンテキスト
DateDetailViewで指定されたmodelに関連付けられたオブジェクトを1つだけ含みます。
ノート
デフォルトの
template_name_suffixは_detailです。
例 myapp/urls.py:
from django.urls import path from django.views.generic.dates import DateDetailView urlpatterns = [ path( "<int:year>/<str:month>/<int:day>/<int:pk>/", DateDetailView.as_view(model=Article, date_field="pub_date"), name="archive_date_detail", ), ]
例 myapp/article_detail.html:
<h1>{{ object.title }}</h1>
注釈
上に挙げたすべてのジェネリックビューは、 MultipleObjectTemplateResponseMixin (アーカイブビューの場合) や SingleObjectTemplateResponseMixin (DateDetailView の場合) を含まないというだけで、同じ Base ビューを持っています: