こんばんは、エンジニアの眠れない夜です。
今回は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
コメントを残す