【17/8/28】副業13日目
前回は、検索機能の追加としてTopページの虫眼鏡ボタンをクリックしたら検索結果ページに遷移する部分まで実装できた。
今日は、検索結果を検索結果ページに引き渡す部分を調査していく。
まず、 htmlからの get/post リクエストの受け取り方についてやり方がいくつかあるみたいでどちらがよいのかわからなかった。同じ悩みを持った人がいたのでリンクを貼っておく。
要はFormを使うと以下の利点があるよということらしい。
フォームによって提出 (submit) されたデータの処理は、Django の HttpRequest クラスだけでも実現できます。
しかし、フォー ムライブラリを使うと、フォーム処理に必要な共通のタスクの面倒を見てくれます。フォームライブラリを使えば、以下のようなことを実現できます:1.フォームウィジェットから、 HTML フォームを自動的に生成して表示できます。
2.提出されたデータに対して、バリデーション規則 (validation rule) を適用できま す。
3.バリデーションエラーを検出したときに、フォームをエラーメッセージ付きで表示で きます。
4.提出されたデータを、適切な Python のデータ型に変換できます。
せっかくなので、Formによる検索機能を実装してみたいと思ったが、それにあわせてtop.htmlの修正が必要になりそうで、別の師匠が作成するため、Formは使わない方法でやってみることに。
1時間以上かけてやっとできた。原因はcontextに登録するキー(search)をダブルクォーテーションで囲っていなかったため。。。(泣)
top/view.pydef search(request):
if request.method == ‘POST’:
print(“Method is POST”)
context = {
“search” : request.POST[“search”]
}
return render(request, ‘search.html’, context) else:
print(“Method is GET”)
return render(request, ‘search.html’)top/templates/search.html{% block content %}
<h2>テスト</h2>
<h2>{{ search }}</h2>
{% endblock content %}
備忘のために簡単に処理内容を書くと、request.POST(QuerySetのオブジェクトらしい)から、HTML側のnameで指定した「search」を使って値を取り出し、contextという辞書の中に「"search":取り出した値」で保存している。renderメソッドを使ってcontextをテンプレートへ渡している。
テンプレート側(search.html)では、キー(search)を使って読み込むだけ。
次回はsearch.htmlに渡した検索ワードを使ってDBを検索し、HTMLに表示するところをやるぞ! あ、後CSRFも組み込んでみる。
contains
大小文字を区別する包含テストです。
使い方の例を示します:
Entry.objects.get(headline__contains='Lennon')
SELECT … WHERE headline LIKE ‘%Lennon%’;
続く。
補足:ModelFormとFormの使い分け
Djangoフォームを使ってみよう では django.forms.Form クラスを親クラスとしていましたが、Djangoには django.forms.ModelForm と言う Modelクラスを元にFieldを自動的に生成してくれるクラスが存在します。登録や更新処理ではModelFormクラスを使う方が良いでしょう。
注釈
FormとModelFormの使い分けは?と言う疑問が出ると思いますが、私は検索で使う入力項目はFormを、
登録・更新で使う入力項目はModelFormを使うようにしています。
今回のケースではあまりModelFormクラスのメリットを感じ無いと思いますが、ModelFormは
validationを行う時にユニーク制約のチェックも行う為、複雑なModelになるほどModelFormが便利になります。

