(最終更新月:2021年11月)
「URLから任意の値を受け取る方法ってないの?」
「URLからクエリを受け取った場合とかってどうやって処理するの?」
というDjango初学者の方へ向けての記事となります
当記事では、
- URLに入力された値をviews.pyで受け取る方法
を解説していきます
✔YouTube解説動画
当記事の内容は動画を見ながら進めると、約15分程度で完了します。
動画ならではの情報も解説しているので、記事と一緒にご覧ください。
動画の概要欄には、単元ごとのコードを紹介しているgithubページも載せています。
今回で達成すること
別記事にてviews.pyで生成したランダムな数値をHTMLファイルへ渡す方法を解説しました
今回はこちらのページを発展させるという意味で、「ランダムに生成された数値と、URLに打ちこまれた数値を足し算する!」というページを作っていきます
「何の役に立つんだ!」という声も聞こえてきそうですが、あくまでも主旨はURLから値を受け取る方法を理解いただくことですので、「数値を足し算する」ことは補足的な要素なのであまり気にせずお進みください
全体の構造
URLで値を受け取るためには2つのポイントがあります
- urls.pyで、受け取る値の引数を設定する
- views.pyで、引数を使い値を受け取る
言葉だけではわかりにくいと思いますので、まずは現状でそれぞれのファイルがどうなっているかをご覧頂き、変更を加えていきます
現状の確認
【urls.py】
...
from .views import nippoDetailView
urlpatterns = [
...,
path("detail/", nippoDetailView)
]
【views.py】
def nippoDetailView(request):
template_name="nippo/nippo-detail.html"
random_int = randint(1,10)
ctx = {
"random_number": random_int,
}
return render(request, template_name, ctx)
それぞれ変更していきましょう
urls.pyで値を引数へ格納する
urls.pyでの記述方法は下記のとおりです
path(“アドレス/<値の種類: 値の引数>/”, view関数)
【コード例】
...
from .views import nippoDetailView
urlpatterns = [
...,
path("detail/<int:number>/", nippoDetailView)
]
<int:number>
が追記した部分です
- intは「値の種類」(文字列の場合はslugを使います)
- numberはview関数(クラス)で受け取るときに使う引数
ということを頭に入れて先へ進みましょう
views.pyで値を受け取る
views関数で値を受け取る方法は下記のとおりです
def 関数名(request, 引数名):
クラスベースビューでは、「self.kwargs」を使用しますがここでは割愛します
【コード例】
def nippoDetailView(request, number):
template_name="nippo/nippo-detail.html"
random_int = randint(1,10)
ctx = {
"random_number": random_int,
"number": number,
}
return render(request, template_name, ctx)
ここでは受け取った値を、コンテキストで渡しています
値を見てみる
テンプレートを下記のとおり書き換え、きちんと値が受け取れているか見てみましょう
【nippo-detail.html】
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Views.pyからHTMLへ</title>
</head>
<body>
<h1>今日のラッキーナンバーはこちら→ {{random_number}}</h1>
<p>あなたの入力した数字は→ {{ number}} </p>
<p> {{random_number}} + {{number}} = {{ random_number|add:number}}</p>
</body>
</html>
無事URLとして打ち込んだ値が表示されてます!
上記のコードのうち、テンプレートフィルター「| add:数値」についての説明は割愛しています。
詳しくはこちらをご覧ください。
まとめ
ポイントは2つありました。
- urls.pyで<値の種類:引数名>を指定する
- views.pyで、requestに続き、引数名を受け取る
値の種類については、「int」だけでなく「slug」(文字列)も使えますので、文字列を受け取りたい場合は「slug」をお使いください
✔次回のチュートリアル
すでにお気づきの方も多いかもしれませんが、現在作成した「nippo-list.html」と「nippo-detail.html」という2つのファイルには同じような記述が多くあります
次回の記事では、このような繰り返しの記述を避ける「ベーステンプレート」「ブロックタグ」についての解説をしていきます