モデルからフォームを生成するための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。