Djangoでフォームとデータベースを使用するとき、今まではmodels.pyとforms.pyに同じようなコードを書いて処理していました。
例えばフォームから「名前」・「年齢」・「メールアドレス」を送信し、それらをデータベースに保存する場合は
forms.py
from django import forms from .models import Friend class HelloForm(forms.Form): name = forms.CharField(label="Name") age = forms.IntegerField(label = "Age") mail = forms.EmailField(label = "Email")
models.py
class Friend(models.Model): name = models.CharField(max_length=100) age = models.IntegerField(default=0) mail = models.EmailField(max_length=200)
のように設定し、views.pyでは
if (request.method == "POST"): #フォームクラスのインスタンス作成 name = request.POST["name"] mail = request.POST["mail"] age = int(request.POST["age"]) #保存した変数をもとにFriendクラスのインスタンスを生成 friend = Friend(name = name,mail = mail,age = age) friend.save() #ローカルホスト/myappにリダイレクト return redirect(to = '/myapp')
のように、フォームから送信された情報を一つ一つ変数に格納し、そこからモデル(Friendクラス)のインスタンスを作成してレコードに追加していました。
これをDjangoのModelFormを使ってもっと簡潔に処理をしてみたいと思います。
ModelFormを使えばModelで定義したクラスをforms.pyのクラスで継承することができます。
Models.pyでテーブルとレコードを作成した後に、forms.pyを以下のように変更します。
from django import forms from .models import Friend class FriendForm(forms.ModelForm): class Meta: model = Friend fields = ['name','mail','age']
今回はFriendFormというModelFormを継承したクラスを作成し、その中でmodels.pyのテーブル(Friendクラス)とレコードを読み込んでいます。
このように書くことでmodels.pyとforms.py両方に同じようなコードを書く必要がなくなります。
またModelFormを活用することでviews.pyの記述もシンプルにすることができます。
views.py
if (request.method == 'POST'): obj = Friend() friend = FriendForm(request.POST,instance=obj) friend.save() return redirect(to = "/myapp")
先程は一つ一つを変数に格納する作業がありましたがいましたが、今回は簡単にインスタンスを作成することができました!