slugによるページ
CoddyのDjangoジャーニー「クラスベースビュー」セクションの一部。レッスン 6/18。
/jobs/7/では、その仕事について何もわかりません。/jobs/python-developer-brightline/なら、それが何なのかを人にも検索エンジンにも伝えられます。この読みやすい部分はスラッグです。小文字の単語をハイフンでつなげたものです。すべてのJobには、すでにslugフィールドがあります。
URL引数の名前がslugの場合、DetailViewはslugフィールドが一致する行を見つけます。どちらの名前も変更できます。ルートが"recipes/<slug:recipe_slug>/"であるレシピサイトでは、ビューに次のように指定します。
class RecipeDetailView(DetailView):
model = Recipe
slug_url_kwarg = "recipe_slug"slug_url_kwargはURL引数の名前を、slug_fieldはモデルフィールドの名前を指定します。どちらもデフォルトは"slug"です。ビューに知らせずにURL引数の名前を変更すると、pkもスラッグも見つからず、エラーになります。
チャレンジ
簡単求人ページをIDではなくスラッグで表示するようにしましょう。
jobs/urls.pyで、detailルートが求人のpkではなくスラッグを受け取るようにします。job_list.htmlで、各リンクに求人のスラッグを渡すようにします。
/jobs/でPython Developerをクリックすると、アドレスは/jobs/python-developer-brightline/になります。
自分で試してみよう
from django.urls import path
from . import views
app_name = "jobs"
urlpatterns = [
path("", views.HomeView.as_view(), name="home"),
path("about/", views.AboutView.as_view(), name="about"),
path("jobs/", views.JobListView.as_view(), name="list"),
path("jobs/<int:pk>/", views.JobDetailView.as_view(), name="detail"),
]
クラスベースビューのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド