- モデル作成
- フォーム作成
- テンプレート作成
- ビューの実装
モデル作成
例として、ものすごく簡単なモデルを用意
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