概要
Djangoの汎用ビューの
- template_name
- context_object_name
について、学んだことを備忘としてまとめました。
背景
さりげなく出現してくるこれら二つの変数ですが、ListViewの場合はviewにModelを指定してあげればWeb上に良さげに表示してくれます(テンプレートとかurlの設定はもちろん必要ですが)。
指定する場合と指定しない場合の違いについて頭から抜けていかないように...。
汎用ビューとは
Djangoの方で「だいたいWebページってこんな画面必要だよね」というページの設定をあらかじめ用意してくれています。例えば、ListViewを使うと1ページに表示させるアイテムの数を「paginate_by」という変数を使って指定することができたり。チュートリアルには汎用ビューを使うことでコードを少なくすることができるとありましたが、ソースをみてみたらなかなか面白かったです。
備忘も兼ねてまた今度まとめたいと思います。
ListViewにおけるtemplate_name
とcontext_object_name
の役割
これら二つの変数は特に指定しなくてもデフォルト値が設定されるため、必要なければ設定しなくて問題ないです。
例えば、User
モデルを作成してそのリストを表示させたいとします。
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)
from django.views.generic import ListView
from .models import User
class UserListView(ListView):
model = User
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.html
をdata_list.html
に変えてみると、Djangoさんから「user_list.htmlが無いんすけど」と怒られると思います。
共通的なリスト表示テンプレートを作成してそれを使いまわしたい時とかに利用すると良いのだろうなぁと思います。