10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Django ListViewについて(template_name, context_object_name)

Posted at

概要

Djangoの汎用ビューの

  • template_name
  • context_object_name

について、学んだことを備忘としてまとめました。

背景

さりげなく出現してくるこれら二つの変数ですが、ListViewの場合はviewにModelを指定してあげればWeb上に良さげに表示してくれます(テンプレートとかurlの設定はもちろん必要ですが)。
指定する場合と指定しない場合の違いについて頭から抜けていかないように...。

汎用ビューとは

Djangoの方で「だいたいWebページってこんな画面必要だよね」というページの設定をあらかじめ用意してくれています。例えば、ListViewを使うと1ページに表示させるアイテムの数を「paginate_by」という変数を使って指定することができたり。チュートリアルには汎用ビューを使うことでコードを少なくすることができるとありましたが、ソースをみてみたらなかなか面白かったです。
備忘も兼ねてまた今度まとめたいと思います。

ListViewにおけるtemplate_namecontext_object_nameの役割

これら二つの変数は特に指定しなくてもデフォルト値が設定されるため、必要なければ設定しなくて問題ないです。
例えば、Userモデルを作成してそのリストを表示させたいとします。

models.py
from django.db import models


class User(models.Model):
    first_name = models.CharField(primary_key=True, max_length=100)
    last_name = models.CharField(max_length=100)
vews.py
from django.views.generic import ListView

from .models import User

class UserListView(ListView):
    model = User
user_list.html
user_list.html
<ul>
  {% for data in user_list %}
  <li>{{ data.first_name }} : {{ data.last_name }}</li>
  {% endfor %}
</ul>

あとはよしなにurls.pyに設定を書いてあげればUserモデルがリスト表示されると思います。指定したモデルに対してテンプレートとテンプレート内のコンテキスト変数(例だとuser_list)がそれぞれ下記のように対応していれば特に指定する必要なしです。

  • テンプレート:<アプリ名>/<モデル名>_list.html
  • コンテキスト変数:<モデル名>_list

親切なことに、特にテンプレートとコンテキスト変数の指定が無い場合は上記の名前のものを設定して使ってくれるんですね。
試しにuser_list.htmldata_list.htmlに変えてみると、Djangoさんから「user_list.htmlが無いんすけど」と怒られると思います。

共通的なリスト表示テンプレートを作成してそれを使いまわしたい時とかに利用すると良いのだろうなぁと思います。

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?