【Django】URLのクエリパラメータを取得する方法|実例付

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2021年11月)

「URLから任意の値を受け取る方法ってないの?」

「URLからクエリを受け取った場合とかってどうやって処理するの?」

というDjango初学者の方へ向けての記事となります

当記事では、

  • URLに入力された値をviews.pyで受け取る方法

を解説していきます

✔YouTube解説動画

当記事の内容は動画を見ながら進めると、約15分程度で完了します。

動画ならではの情報も解説しているので、記事と一緒にご覧ください。

動画の概要欄には、単元ごとのコードを紹介しているgithubページも載せています。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間17万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

今回で達成すること

別記事にてviews.pyで生成したランダムな数値をHTMLファイルへ渡す方法を解説しました

今回はこちらのページを発展させるという意味で、「ランダムに生成された数値と、URLに打ちこまれた数値を足し算する!」というページを作っていきます

「何の役に立つんだ!」という声も聞こえてきそうですが、あくまでも主旨はURLから値を受け取る方法を理解いただくことですので、「数値を足し算する」ことは補足的な要素なのであまり気にせずお進みください

全体の構造

URLで値を受け取るためには2つのポイントがあります

  1. urls.pyで、受け取る値の引数を設定する
  2. 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>

http://localhost:8000/nippo/detail/3/

無事URLとして打ち込んだ値が表示されてます!

上記のコードのうち、テンプレートフィルター「| add:数値」についての説明は割愛しています。

詳しくはこちらをご覧ください。

まとめ

ポイントは2つありました。

  1. urls.pyで<値の種類:引数名>を指定する
  2. views.pyで、requestに続き、引数名を受け取る

値の種類については、「int」だけでなく「slug」(文字列)も使えますので、文字列を受け取りたい場合は「slug」をお使いください

✔次回のチュートリアル

すでにお気づきの方も多いかもしれませんが、現在作成した「nippo-list.html」と「nippo-detail.html」という2つのファイルには同じような記述が多くあります

次回の記事では、このような繰り返しの記述を避ける「ベーステンプレート」「ブロックタグ」についての解説をしていきます

タイトルとURLをコピーしました