検索フォームをでっちあげる

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

  • モデル作成
  • フォーム作成
  • テンプレート作成
  • ビューの実装

モデル作成

例として、ものすごく簡単なモデルを用意
class Book(models.Model)
   title = models.CharField(max_length=100)
   subtitle = models.CharField(max_length=100, blank=True, null=True)
   publish_date = models.DateField(blank=True, null=True)

syncdbしとく

検索フォームを作る

forms.py
from django import forms
class BookSearchForm(forms.Form)
   title = forms.CharField(min_length=2, max_length=100)
   publish_date = forms.DateField(required=False)

ModelとセットになるModelFormを使ってもいいけど、説明が面倒なので Formを使う。

テンプレート作成

search.html
<form action='/search/' method='POST>
  {% crsf_token %}
  <table>
    {{ form.as_table }}
  </table>
  <input type='submit' value='検索' />
</form>

ビューの実装

urls追加
url(r'^search/$, views.search),

views.py
from forms import BookSearchForm
from modesl import Book
from django.template import RequestContext
from django.shortcuts import render_to_response
from djnago.db.models import Q
def search(request)
   form = BookSearchForm()
   if request.method == 'GET'
       return render_to_response(
           'search.html', {'form': form}, RequestContext(request))
   elif request.method == 'POST'
      form = BookSearchForm(request.POST)
      books = Book.objects.all()
      if form.is_valid()
          books = book.filter(Q(title__contains=form.cleaned_data['title']) |
                             Q(subtitle__contains=form.cleaned_data['title']))
   return render_to_response(
       'search.html',
       {'form':form, 'books':books},
       RequestContext(request)
こんな感じ。

form['title'].value() は form.data['title'] としてもよい。ただ、一番良いのはcleaned_dataを使うこと。
value()はあまり使わないほうがいいようだ。value()がHTMLで実際に入力された(選択された)値を返すのに対して
cleaned_data['title']なら、Fieldオブジェクト内でto_pythonし、Formオブジェクトでcleanされた値を返してくれるので
Validationが確実に通った上で処理するなら、value()を使わずに、cleaned_dataを使う。

あと、こーいった処理はViewに書かず、Formに含めてしまうか、
更に言うなら、独自のレイヤを増やして(たとえばServiceとかBussinessみたいな)、そこに書いたらいいかもしか。
そん辺はプロジェクトの規模によりけりではある。
最終更新:2013年02月05日 20:47
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。