前回の続きで、Djangoについて学んでいきます。
今回もモデルについて勉強していきます。
Djangoの勉強内容は以下の本を参考にしています。
参考
Python Django3超入門 (日本語) 単行本 – 2020/6/13 掌田 津耶乃 (著)
コードは以前の記事を参考にしてください。
Djangoを勉強してみる(入門編)
Djangoを勉強してみる(入門編その2)
Djangoを勉強してみる_urlを学ぶ(入門編)
Djangoを勉強してみる_テンプレートを学ぶ(入門編)
Djangoを勉強してみる_テンプレートを学ぶ_その2(入門編)
Djangoを勉強してみる_フォームを学ぶ_その1(入門編)
Djangoを勉強してみる_フォームを学ぶ_その2(入門編)
Djangoを勉強してみる_フォームを学ぶ_その3(入門編)
Djangoを勉強してみる_モデルを学ぶ_その1(入門編)
Djangoを勉強してみる_モデルを学ぶ_その2(入門編)
Djangoを勉強してみる_モデルを学ぶ_その3(入門編)
今回の目的
前回はCRUDのCREATE(新規作成)画面を作成しました。
今回はもう少しCreateのコードをModelFormを使って少なくする方法を勉強していこうと思います。
Createのコードを減らしてみる
前回のCreateのコードでは、forms.pyに必要なデータをすべて一つずつ書きだし、views.pyでも同じくすべてのデータを格納していました。
ですが、このやり方はめんどくさいのでもっと簡単な方法があります。
それが、「ModelForm」です。
ModelFormとはDjangoが準備したフォームを作成するためのクラスです。
このModelFormを使うことでもっと簡単にフォームの作成ができます。
それではやっていきます。
1.forms.pyを編集
ファイル:sample_app>hello>forms.py
コード:
from django import forms
from .models import Friend
class FriendForm(forms.ModelForm):
class Meta:
model = Friend
fields = ['name', 'mail', 'age', 'gender', 'birthday']
コードはこれだけです。
Modelformを使ってコードを記述するときは以下のようにします。
class クラス名(forms.ModelForm):
class Meta:
model = モデルクラス
fields = [フィールド名を入力]
前回のコードと比べてみましょう。
前回のコード:
from django import forms
class HelloForm(forms.Form):
name = forms.CharField(label='Name')
mail = forms.EmailField(label='Mail')
age = forms.IntegerField(label='Age')
gender = forms.BooleanField(label='Gender', required=False)
birthday = forms.DateField(label='Birthday')
比べてみると明らかに記載するコード量が減ってますね。
次はviews.pyを編集します。
2.views.pyを編集
ファイル:sample_app>hello>views.py
コード:
from django.shortcuts import render
from django.http import HttpResponse
from django.shortcuts import redirect
from .models import Friend
#from .forms import HelloForm
from .forms import FriendForm
def index(request):
data = Friend.objects.all()
params = {
'title': 'Hello World!!',
'msg': 'ALL Friends',
'data': data,
}
return render(request, 'hello/index.html', params)
#create-new
def create(request):
if (request.method == 'POST'):
obj = Friend()
friend = FriendForm(request.POST, instance=obj)
friend.save()
return redirect(to='/hello')
params = {
'title': '新規作成画面',
'form': FriendForm(),
}
return render(request, 'hello/create.html', params)
前回のコードでは、POSTで送られてきたデータを各変数へ代入していましたが、ModelFormを使った時のコードだとそのコードをたった2行で同じことができます。
obj = Friend() #モデルのFriendクラスをインスタンス化 friend = FriendForm(request.POST, instance=obj)
処理の流れとしては、POSTでデータがきたときに、モデルのFriendクラスインスタンスを作成しています。
その後に、FormsのFriendFormクラスインスタンスの引数としてrequest.POSTとFriendクラスのインスタンスを指定しています。
最後に見栄えをよくするため、テンプレートを修正します。
3.create.htmlを編集
ファイル:sample_app>hello>templates>hello>create.html
コード:
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/5.0.0-alpha1/css/bootstrap.min.css" integrity="sha384-r4NyP46KrjDleawBgD5tp8Y7UzmLA05oM1iAEQ17CSuDqnUK2+k9luXQOfXJCJ4I" crossorigin="anonymous">
<title>{{ title }}</title>
</head>
<body class = "container">
<h1>{{ title }}</h1>
<form action="{% url 'create' %}" method=post>
{% csrf_token %}
<table class="table">
<tr><th><td>
{{ form.as_table }}
</td></th></tr>
</table>
<input type="submit" value="登録" class="btn btn-primary">
</form>
</body>
</html>
BootStrapのテーブルクラスを利用して画面を整えてみました。
以上で設定が終わったので、動作確認してみます。
動作確認
python manage.py runserver
ブラウザで以下にアクセスします。
http://localhost:8000/hello/createアクセスするとちゃんとテーブル表示されて、前回作成した内容と同じ新規作成画面を表示することができました。

今回の目的であるCreateをModelFormを使って少ないコードで実現することができました。
次回は登録したデータを修正するUpdateついて勉強していこうと思います。
以上です。ありがとうございました。
P.S.
勉強を継続することが苦手ですか?
少し前からココナラというサービスで習慣化のテクニックについて教えるサービスを始めました。
もし、いつも3日坊主で終わってしまうという方や、ダイエットを続けたい、勉強したい、運動したいなど何か習慣化したいと思っている方がいましたら全力でサポートしますので、まずは覗いてみてください。
すでに何人かの方に実践してもらって効果が出ているという感想をいただいてます。

コメント