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

GenericViewでURLからGET

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

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

[Django] URLの設定方法

こんな感じで取得したいパラメータをP<share>の様に指定します。その後の[0-9]+は0~9の数字が任意の回数(桁数)という意味です。

なので localhost:8000/share/91793932 という感じのURLでアクセスができます。

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

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

通常であればこちらで紹介されているように

[code]

request.GET.get(‘share’)

[/code]

と、するとURLで指定しているshareのパラメータを取得できるはずなのですが、できませんでした…

(確か前にやったときはこれでできたんですけどね…?利用している関数が違うのかな?)

 

いろいろ探して、print()して、最終的にたどり着いた答えがこちらです。

[code]
class IndexShareView(generic.TemplateView):
    template_name = 'index.html'

    def render_to_response(self, context, **kwargs):
        response = super(IndexShareView, self).render_to_response(context, **kwargs)
        print("share:{}".format(context["share"]))
        return response
[/code]

contextをprint()したらその中にパラメータが入っているのを見つけました。(kwargsは初期の段階でプリントしていたのですが、contextに入っていると思わず無視していました。まだまだDjangoの理解が足りないですね…)

[Django] contextってなに?

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

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

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

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

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

例:

[code]

class IndexShareView(generic.TemplateView):
template_name = ‘index.html’

def render_to_response(self, context, **kwargs):
response = super(IndexShareView, self).render_to_response(context, **kwargs)
context[“share”] = context[“share”] * 5
return response

[/code]

こんな封に書き換えることでTemplateに計算した後の値を渡すことができます。

最後に

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

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

私もまだまだ半人前なのでぜひ皆さんと技術のシェアがしたいです!Twitterもやってますのでフォローをお願いします(^^) /@sleepless_se

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.