URLの設計 (slugを使う)
2023-01-02
URLの役割
URLの役割はWebページの地図である。その地図の設計はとても大事でWebページの訪問者と作成者の両方にとって「どこに」「何があるのか」を教えてくれる。
そうするとURLに使う文字はWebページに表示されている内容を表すのが良い。例えば料理のレシピであれば「cooking_recipe」とする。URLをみれば料理についてレシピ一覧が公開されているのだろうと思う。そしてレシピを選択したら、そのレシピの詳細がのったページに移動するイメージ。
URLの追加
ここでは実際に「 http://127.0.0.1:8000/webpage/category/title/」というURLを追加する。
コード1.
/ProjectName/webpage/urls.py
from django.urls import path
from . import views
app_name = 'webpage'
urlpatterns = [
path('', views.index, name='index'),
path('category/title/', views.title, name='title'),
]
urlpatterns
の最初の要素path(‘’, views.index, name=‘index’),
がすでにURLの「http://127.0.0.1:8000/webpage/」までを示している。そのためそこからcategory/title/
とすれば、「 http://127.0.0.1:8000/webpage/category/title/」にアクセスできるようになる。
そしてアクセスした後views.py
にあるtitle
関数を呼ぶように設定している。
views.py
ではtitle.html
を表示するように設定。
コード2.
/ProjectName/webpage/views.py
from django.shortcuts import render
def index(request):
return render(request, 'index.html')
def title(request):
return render(request, 'title.html')
title.html
は以下のようにする。
コード3.
/ProjectName/webpage/templates/title.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Webページ タイトル</title>
</head>
<body>
<div style="text-align: center;">
<h1>タイトル</h1>
</div>
<div>
ここから「見出し」や「本文」などを書いてWebページを作っていきます。Webページの内容は様々で料理のレシピや本の感想、日記など語りたいことを表します。
</div>
</body>
</html>
ProjectNmae/manage.py
がある場所でpython manage.py runserver
として「 http://127.0.0.1:8000/webpage/category/title/」にアクセスしてみると中央上に「タイトル」と出る。
slugを使う
ここでタイトルを増やしたいと思う。URLで「category/title/」だけでなくtitle1やtitle2、title3、、、と増やして、その度にviews.py
に関数を追加して、HTMLファイルも用意する。。。これはとても大変に思う。ここでDjangoの良いところが出てくる。urls.py
とviews.py
を以下のように変更する。
コード4.
/ProjectName/webpage/urls.py
from django.urls import path
from . import views
app_name = 'webpage'
urlpatterns = [
path('', views.index, name='index'),
path('category/<slug:title>/', views.title, name='title'),
]
コード5.
/ProjectName/webpage/views.py
from django.shortcuts import render
def index(request):
return render(request, 'index.html')
def title(request, **kwargs):
return render(request, 'title.html')
urls.py
ではtitle
ではなく
と変更した。views.py
ではtitle
関数の引数に**kwargs
を追加した。こうすることで「category/任意の文字/」でアクセスできるようになる。試しに「 http://127.0.0.1:8000/webpage/category/title2/」とアクセスしてみると上手く表示されるはずだ。
URLを元に表示内容を変える
アクセスできたのは良いけど画面に「タイトル」としか表示されない。実際にはタイトルごとに表示を変えたいと思う。
views.py
のtitle
関数でtitle.html
を表示するように設定している。ここにコンテキスト (context) というものを追加する。コンテキストの内容は辞書形式で以下のようにする。
コード6.
/ProjectName/webpage/views.py
from django.shortcuts import render
def index(request):
return render(request, 'index.html')
def title(request, **kwargs):
context = {
'title': kwargs['title'],
'contents': 'ここから「見出し」や「本文」などを書いてWebページを作っていきます。Webページの内容は様々で料理のレシピや本の感想、日記など語りたいことを表します。'
}
return render(request, 'title.html', context)
urls.py
でとしたためkwargs
にはtitle
というキーワードが入っており、それを参照するとURLに入力されている値が返ってくる。
title.html
は以下のようにする。
コード7.
/ProjectName/webpage/templates/title.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Webページ {{ title }}</title>
</head>
<body>
<div style="text-align: center;">
<h1>{{ title }}</h1>
</div>
<div>
{{ contents }}
</div>
</body>
</html>
二重の中括弧「{{ }}」はDjango特有の記法。ここではcontext
に登録していたキーワードtitle
を呼び出すようにしている。そうすることでURLに入力された文字をWebページ上で表示できる。context
に登録したキーワードcontents
も呼び出している。ここの内容も変えるられる。
ここで思うのは「どんなタイトルでもアクセスできてしまう」「タイトルによって本文の内容を変えたい」ことである。そこで登場するのが「モデル」というものである。つまり、モデルがあれば特定のタイトルのみをアクセス可能にしたり、タイトルに紐づいたWebページが作成できる。