[Django]GenericViewでURLからパラメータをGETする方法

GenericViewでURLからGET

こんばんは、エンジニアの眠れない夜です。

今回はDjangoのGenericViewでURLからパラメータをGETする方法を紹介します。

[Django] URLの設定方法

こんな感じで取得したいパラメータをP<share>の様に指定します。その後の[0-9]+は0~9の数字に1回以上一致するという正規表現です。

なので localhost:8000/share/91793932 といったURLでアクセスできます。

url(r'^share/(?P<share>[0-9]+)$', views.IndexShareView.as_view(), name='home_share'),

[Django] URLパラメータをGET(取得)する方法

GenericViewを使わいない場合ならこちらで紹介されているように

request.GET.get('share')
と、するとURLで指定しているshareのパラメータを取得できるのですがGenericViewでは引数にrequestが無いので使えません。

代わりにself.kwargs.get("キーワード")このように呼び出します。今回であればself.kwargs.get("share") です。

「どこからでてきたのそのselfは…?」

そんな声が聞こえてきそうです。

selfはクラス内で変数を定義するときに引数として宣言しますね。
なので目的別に

・get_context_data(self, **kwargs)
パラメータで受け取った値を編集したり、テンプレートに渡したい時

・form_valid(self, form)
パラメータの値をフォーム送信時に設定する時

・get_success_url(self)
モデルの作成、更新、削除などが成功時のリダイレクトに使う時

このように関数をオーバーライドするときのselfに対してself.kwargs.get("キーワード")で値を取得します。

get_context_data(self, **kwargs) でGETの値をテンプレートに渡す

GenericViewクラスの中にこちらを追加します。

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['share'] = self.kwargs.get('share')
    return context

パラメータで受け取った値をcontext(型は辞書)にキーはshareにしてセットしたものを返します。

テンプレートに{{ share }}と入力してリロードしてみてください。

shareの値が表示されます。

[Django] contextってなに?

contextはViewで作成・編集した値をTemplateに渡して表示するときに使います。

先程の例の場合はではshareというキーの中に localhost:8000/share/91793932 ここで指定した91793932という数字が入っています。

テンプレートファイルで {{ share }} とするとその部分に 91793932 と表示されます。

テンプレート内ではすべてStringとして表示されるので {{ share }} * 5 みたいに計算はできません。

なので先程の def get_context_data(self, **kwargs): の中でいろいろ加工して値を渡します。

例:

class TestView(TemplateView):
    template_name = "test.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
     # intに変換して掛け算
        context['edit_share'] = int(self.kwargs.get('share')) * 5
        return context

こんな風に書き換えることで計算した後の値をテンプレートにedit_shareとして渡すことができます。

※ テンプレートで {{ edit_share }} で計算した値が表示されます。

最後に

Djangoは使い慣れると驚くほどのスピードでサービスを展開できるので是非マスターしたいですね!

公式ドキュメントは充実いているのですが、読んでもわからないところや自分の理解が足りず、そのとおりやってるつもりが。。。うまく動かない!とかもあるのでまだまだ勉強の余地があります。

Twitterもやってますのでフォローいただけると嬉しいです(^^)v@sleepless_se

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください