PythonMania

普段はロボットとAIを組み合わせて色々作ってます。Python関係以外も色々投稿していくと思います。

【Django】ModelFormを使ってフォーム処理をシンプルにする

f:id:mizuhiki0111:20190430175940p:plain

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")


先程は一つ一つを変数に格納する作業がありましたがいましたが、今回は簡単にインスタンスを作成することができました!