【17/8/24】副業11日目
前回は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に変更できるが、以下のように一度リスト化することも可能なようだ。
tags_all = site.sitetag_set.all()
tags = []
for tag in tags_all:
tags.append(tag.name)
コンテキストの使い方
目からうろこでした。contextはキーと変数の組み合わせだと思っていたのだが、tagsのようなリスト型も扱えるとは!(まー自分が無知なだけだが。。苦笑)
ただこれがわかったので、View.pyでいろいろと必要な情報を加工して、最後にcontextで必要な形で渡してあげればよいということがわかった。
context = {
‘site’: site,
‘created_at’: created_at,
‘records’: records,
‘tags’: tags,
‘captures’: captures,
}
TemplateからView.pyへのアクセス方法と値の受け渡し方
TelmpalteからView.pyにアクセス(Formを投げる・値を渡す)方法がわからなかったので調べてみた。
テンプレートシステムは、変数の属性にアクセスするためにドット使った表記法を使用します。
{{question.question_text }}を例にすると、はじめに Django は `` question`` オブジェクトを辞書検索を行います。これには失敗するので、今度は属性として検索を行い、この場合は成功します。仮に、属性の検索に失敗すると、リストインデックスでの検索を行います。メソッドの呼び出しは
{% for %}ループの中で行われています。question.choice_set.allは、 Python コードのquestion.choice_set.all()と解釈されます。その結果、Choiceオブジェクトからなるイテレーション可能オブジェ クトを返し、{% for %}タグで使えるようになります。
なるほど~。以下は、website配下のview.pyに記載されたcaptureというメソッドにアクセスし、Template内で持っているsiteの変数から.idでID属性にアクセスしている。
<a href=”{% url ‘web:capture’ site.id %}テンプレートでフォームの作り方
polls/templates/polls/detail.html
<h1>{{ question.question_text }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>
form actionのところに前述したurlテンプレートタグでView.pyに記載さいた関数を指定してあげれば、よいことがわかった。
これを応用すれば検索方法も見えてくくるかもしれない。
最後に。
やはり、Djangoは機能が多く、学習コストは高い気がする。恐らくスタカフェでBottleをやっていなければまったく理解できなかったと思われる。。。やってみると意外と考え方はほとんど変わらずやり方・書き方が違うだけのように感じた。
今日はほとんどが学習で終わってしまったので、明日は開発を先に進めたい。1.トップページでCSSを読み込ませながらキャプチャ画面が表示されるようにする。2.検索機能を実装してみる。
続く。

