【17/8/24】副業11日目

Ryo Uehara
Aug 24, 2017 · 6 min read

前回はView.pyからTemplateに値を渡してTemplate側でfor文をまわし表を作成した。Modelから取得したオブジェクトを辞書へ変換する方法がわからず、ゼロパディングした値を渡せずに終わった。

今回は師匠にやり方を教えてもらったので、その方法で取得したQuerySetオブジェクトを辞書へ変換しつつゼロパディングした値も追加した上でTemplateへ渡すことをやってみる。

まず、QuerySetから辞書への変換はvalue()を使うことで実現できた。
これでsitesに辞書型のオブジェクトができる?

sites = Site.objects.all().values()

その上で、以下の.formatを使ってゼロパディングの値を生成しつつ"zeropad_id"というキーでsites辞書に値を追加してやる。

for site in sites:  site[‘zeropad_id’] = ‘{0:010d}’.format(site[‘id’])

自分で書くとここまでシンプルにはかけないな。。。。(涙)
もっと精進しなければ! 師匠ありがとう。

Template内には、以下のように定義することでうまく実現できた。

<td><p class=”temp-capture” style=”background-image:url(‘{% static ‘upload/’ %}{{ site.zeropad_id }}.png’)”></p></td>

{% static %}はテンプレートタグのひとつで、setting.pyに記載された「STATIC_URL = ‘/static/’」で定義されたパスを生成してくれる。便利。

QuerySetの使い方

QuerySet.value()でもDictに変更できるが、以下のように一度リスト化することも可能なようだ。

コンテキストの使い方

目からうろこでした。contextはキーと変数の組み合わせだと思っていたのだが、tagsのようなリスト型も扱えるとは!(まー自分が無知なだけだが。。苦笑)

ただこれがわかったので、View.pyでいろいろと必要な情報を加工して、最後にcontextで必要な形で渡してあげればよいということがわかった。

TemplateからView.pyへのアクセス方法と値の受け渡し方

TelmpalteからView.pyにアクセス(Formを投げる・値を渡す)方法がわからなかったので調べてみた。

なるほど~。以下は、website配下のview.pyに記載されたcaptureというメソッドにアクセスし、Template内で持っているsiteの変数から.idでID属性にアクセスしている。

 <a href=”{% url ‘web:capture’ site.id %}

テンプレートでフォームの作り方

form actionのところに前述したurlテンプレートタグでView.pyに記載さいた関数を指定してあげれば、よいことがわかった。

これを応用すれば検索方法も見えてくくるかもしれない。

最後に。
やはり、Djangoは機能が多く、学習コストは高い気がする。恐らくスタカフェでBottleをやっていなければまったく理解できなかったと思われる。。。やってみると意外と考え方はほとんど変わらずやり方・書き方が違うだけのように感じた。

今日はほとんどが学習で終わってしまったので、明日は開発を先に進めたい。1.トップページでCSSを読み込ませながらキャプチャ画面が表示されるようにする。2.検索機能を実装してみる。

続く。

365日備忘録

Full Stack Engineerを目指して

)
    Ryo Uehara

    Written by

    365日備忘録

    Full Stack Engineerを目指して

    Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
    Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
    Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade