ListView
CoddyのDjangoジャーニー「クラスベースビュー」セクションの一部。レッスン 4/18。
掲示板には、すべての求人を一覧表示するページが必要です。テーブルの行の一覧表示はよくある処理なので、Django にはそのためのビューが用意されています。ListView です。モデルを指定すると、行をクエリして、それらを含むテンプレートをレンダリングします。レシピサイトの recipes アプリでの例です。
from django.views.generic import ListView
class RecipeListView(ListView):
model = Recipe
context_object_name = "recipes" # {% for recipe in recipes %}
ordering = ["minutes"] # 所要時間が短い順template_name を指定しない場合、recipes/recipe_list.html がレンダリングされます。これは、アプリのラベル、小文字にしたモデル名、そして _list.html をつなげたものです。テンプレートには常に、行が object_list として渡されます。また、recipe_list としても渡されますが、context_object_name を設定した場合は、代わりにその名前で渡されます。
ordering には order_by() と同じ値を指定できるので、["-minutes"] とすると、最も時間がかかるレシピが最初に表示されます。指定しない場合、行はデータベースの順序で取得されます。
チャレンジ
簡単用意されているテンプレート jobs/job_list.html を使って求人ページを追加します。このテンプレートでは jobs をループ処理します。
jobs/views.pyに、JobのListViewであるJobListViewを追加します。リスト名をjobsにし、最新のposted日付を先頭にして、デフォルトのテンプレートをそのまま使います。jobs/urls.pyに、"jobs/"という名前付きルートlistを追加します。
/jobs/ を開くと、Python Developer が先頭に、Technical Writer が最後に表示されます。
自分で試してみよう
from django.views.generic import TemplateView
from .models import Job
class HomeView(TemplateView):
template_name = "jobs/home.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["count"] = Job.objects.count()
context["latest"] = Job.objects.order_by("-posted").first()
return context
class AboutView(TemplateView):
template_name = "jobs/about.html"
クラスベースビューのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド