DjangoでDetailViewを利用するときのメモ
DjangoでDetailViewを使ったときに、いろいろハマったのでメモしておきます。
下記のようにnameとgenderをattributeに持つUser modelが定義されているとする。
from django.db import models class User(models.Model): name = models.CharField(max_length=20) GENDER = ( ('M', 'Male'), ('F', 'Female') ) gender = models.CharField(max_length=1, choices=GENDER, default='M')
このとき、http://127.0.0.1:8000/app/user/hogehogeで、name = hogehogeの行を取り出してtemplateに渡すUserViewとルーティングを定義する。
# urls.py from django.urls import path from .views import UserView urlpatterns = [ path('user/<slug:name>', UserView.as_view()), ] # views.py from django.views.generic import ListView, DetailView from app.models import User class UserView(DetailView): model = User template_name = 'user.html' slug_field = 'name' slug_url_kwarg = 'name'
- DetailViewのtemplate_nameは、defaultではuser_detail.htmlのように、(小文字のモデル名)_detail.htmlが設定される。
- slug_fieldはdefaultで'slug'に設定されている。ここでは'name'をフィールド名に設定している。
- slug_url_kwargはdefaultで'slug'に設定されている。<slug:slug>ではなく、<slug:name>のようにルーティングしたい場合は'name'を設定する。
各attributeについては、下記で説明されている(Django 2.0)。
Single object mixins | Django documentation | Django
Djangoの公式ドキュメントは、クラスの継承関係を理解していないとドキュメントを追えないんじゃないかなぁ、と思いました。
もう少しユースケースに沿った記述があると助かるのですが…探し方が悪いんだろうな…。