プログラミング > Python >

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.pyviews.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.pytitle関数で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ページが作成できる。