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

Django

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

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

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

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

当記事では、

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

を解説していきます

今回で達成すること

別記事にて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>

※テンプレートフィルター「| add:数値」についての説明は割愛します

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

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

まとめ

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

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

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

【次回について】

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

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

当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています

「Djangoでのアプリ開発を学びたい!」
「Djangoで開発したアプリをWebで公開するにはどうするの?」

という方は必見です!

【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!

関連書籍

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