モデルからフォームを生成するためのModelFormクラス
ものすごく基本的なことだけど、悩んだら(昨日いただいたコメントも合わせて)分かりかけてきた。
- データベースに保存した変数がいくつかある。→それら変数をモデルクラスで定義
- ユーザが入力する変数がこれまたいくつかある。→それら変数をフォームクラスで定義
入力データを利用したり保存するためには、これらフォームデータとモデルデータ(この言い方が正しいかは分からないが)を結び付ける必要がある。昨日書いたテストコードでは、この部分の処理をどうすればいいのか考えていた。すぐ思いつくのは「代入」という操作だけれども、ModelFormクラスを使うと結びつけがスマートにできるということなのだな。
昨日のコードを書き変える。まず、昨日定義したviews.pyの中のInputFormクラスは使わない方針で。代わりにforms.pyを以下のように作成する。models.pyは昨日のまま。
from django import forms from models import Info class InfoForm(forms.ModelForm): class Meta: model = Info
views.pyの中身も書き変える。
... from forms import InfoForm def register2(request): if request.POST: form = InfoForm(request.POST) if form.is_valid(): new_info = form.save() return HttpResponseRedirect('/inputinfo/updated/') else: form = InfoForm() return render_to_response('input_form.html', dict(form=form))
これでOK。urls.pyの中で、
(r'^inputinfo/register2/', register2),
を加えれば、127.0.0.1:8000/inputinfo/register2/をブラウザで開いたとき入力フォームが表示される。
この画面でユーザIDとアドレスを登録したとき、値が保存されたか確認してみる。
>>> ./manage.py dbshell SQLite version 3.5.9 Enter ".help" for instructions sqlite> select * from info_info; 1|a|a 2|root|root@example.com 3|hoge|hoge@example.com
となっているので、OK。