AT's Blog

趣味のプログラミング、ギター、音楽とかとか

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の公式ドキュメントは、クラスの継承関係を理解していないとドキュメントを追えないんじゃないかなぁ、と思いました。

もう少しユースケースに沿った記述があると助かるのですが…探し方が悪いんだろうな…。