Menu
CoddyTech

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"] とすると、最も時間がかかるレシピが最初に表示されます。指定しない場合、行はデータベースの順序で取得されます。

challenge icon

チャレンジ

簡単

用意されているテンプレート jobs/job_list.html を使って求人ページを追加します。このテンプレートでは jobs をループ処理します。

  1. jobs/views.py に、Job の ListView である JobListView を追加します。リスト名を jobs にし、最新の posted 日付を先頭にして、デフォルトのテンプレートをそのまま使います。
  2. 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プレイグラウンド